2013-02-27 3 views
0

Je suis le pire moment de comprendre cela. Je dois utiliser MVVM que je ne comprends pas encore complètement et lier une liste remplie de données de SQL à un radGridView. Cela semble assez facile ... mais je ne peux pas le comprendre. Les données ne s'affichent pas et je pense que c'est parce que je les corrige. Voici mon code pertinent. Toute aide serait appréciée!Relier un GridView à une liste

C# (HistoryAuditLogViewModel.cs):

#region Private Fields 

     private DatabaseConnectionSetting dbSetting; 
     private string tableName = "Manufacturers"; 
     private int primaryKeyID = 1; 
     private string entryID; 
     private string manufacturerID; 
     private string manufacturerName; 
     private string auditDate; 
     private string sqlLogin; 
     private string application; 


     private string dbConnectionKey = Alliance.Infrastructure.Common.DatabaseConnectionSetting.BACKFLOW_SCOPE_KEY; 

     #endregion 

public void Load_Audit() 
     { 
      string strSQLconnection = (dbSetting.SqlConnectionString + "; User Id = " + dbSetting.SqlUserName + "; Password = " + dbSetting.SqlPassword + ";"); 
      SqlConnection sqlConnection = new SqlConnection(strSQLconnection); 

      sqlConnection.Open(); 
      SqlCommand sqlCommand = new SqlCommand("SELECT [EntryID], [AuditValue].value('(row/@ManufacturerID)[1]', 'int') as ManufacturerID, [AuditValue] .value('(row/@ManufacturerName)[1]', 'nvarchar(50)') as ManufacturerName, [AuditDate], [SqlLogin], [Application] from [Backflow].[dbo].[AuditLog] where (TableName = @tableName AND [EntryID] = @primarykey)", sqlConnection); 
      sqlCommand.Parameters.AddWithValue("@tablename", tableName); 
      sqlCommand.Parameters.AddWithValue("@primarykey", primaryKeyID); 

      SqlDataReader reader = sqlCommand.ExecuteReader(); 



      List<String> dataList = new List<String>(); 


      while (reader.Read()) 
       for (int i = 0; i < reader.FieldCount; i++) 
       { 
        string rdr = reader[i].ToString(); 

        dataList.Add(rdr); 
       } 
     } 

XAML (HistoryAuditLogView.xaml):

<telerik:RadGridView Name="AuditGrid" ItemsSource="{Binding dataList}"> 

     </telerik:RadGridView> 
+0

Assurez-vous de définir la propriété 'DataContext' de votre' View' sur votre 'ViewModel'. offtopic: ne pas oublier de fermer 'sqlConnection' – Nogard

+0

Votre' while'loop semble étrange. Voulez-vous aplatir votre table à la liste? –

+0

Il est probablement étrange haha ​​mais, non. Fondamentalement, je ne suis pas difficile sur la façon dont cela doit être fait. Je dois juste utiliser MVVM et mettre les données de sql dans un DataGrid. @Nogard merci de me rappeler de fermer la connexion et j'ai le jeu de propriétés DataContext. – JLott

Répondre

2

propriété publique complète peut vous aider, l'ajouter au niveau de la racine de votre ViewModel:

#region Private Fields 
... 
#region 
#region Public Props 

private List<String> _dataList; 
public List<String> dataList 
{ 
get{ return _datalist;} 
set{_datalist = value;} 
} 

#region 


public void Load_Audit() 
     { 
dataList = new List<String>(); //then your code 
//.... 
} 
+0

Donc, mon XAML comme il est en ce moment fonctionne? – JLott

+0

Ne sait jamais avant d'essayer - mais devrait. – Nogard

+0

D'accord, c'est correct. C'est probablement parce que j'utilise une liste et l'aplatissant comme Hamlet l'a dit mais au lieu des données qui traversent chaque colonne dans le gridView, il est montré en descendant les rangées. Des solutions rapides? Ou dois-je créer une question distincte? – JLott

2
List<String> dataList = new List<String>(); 

Il est juste une variable locale, accessible et valable uniquement dans cette méthode. Vous devez le déplacer dans la propriété ou sur le terrain:

public List<String> DataList { get; set; } 

et dans la méthode:

DataList= new List<String>(); 

while (reader.Read()) 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     string rdr = reader[i].ToString(); 
     DataList.Add(rdr); 
    } 
+0

Donc, comme un get ou un ensemble? J'ai mis à jour ma question pour inclure plus de mon code VeiwModel. – JLott

1

Les liaisons MVVM fonctionnent avec les propriétés publiques dans votre ViewModel ...

En outre, il est également pari ter à lier aux collections observables si possible.

Pour cela, vous devez utiliser le code suivant;

private ObservableCollection<String> _DataList; 
public ObservableCollection<String> DataList { 
    get { return _DataList; } 
    set { 
     if (value.Equals(_Details) == false) { 
       _DataList= value; 
        OnPropertyChanged("DataList"); 
     } 
    } 
} 

Le OnPropertyChanged Sub déclenche l'événement INotifiyPropertyChanged, de sorte que toute modification de la collection sont automatiquement répercutées dans votre GridView.

Vous devez créer ce sous, si vous vouliez, vous pourriez soulever cet événement directement dans le Setter.

Votre code serait alors;

_Details = new ObserservableCollection<string>(); 

while (reader.Read()) 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     string rdr = reader[i].ToString(); 
     dataList.Add(rdr); 
    } 

Votre XAML resterait le même que vous avez ci-dessus.

0

Essayez de régler le DataContext lorsque vous charger la vue d'un ViewModel

MyView view = new MyView(); 
MyViewModel viewModelodel = new MyViewModel(); 

view.DataContext = viewModel; 

Une autre solution serait de mettre la DataContex dans votre vue. Mais vous devez indiquer à View votre emplacement ViewModels.

<Window x:Class="MyNamespace.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyNamespace" 
    Title="MainWindow" Height="Auto" Width="Auto" > 
<Window.DataContext> 
    <local:MyViewModel/> 
</Window.DataContext> 
</Window> 

Bien sûr, vous devez ajouter une propriété publique qui représente votre liste dans votre ViewModel.

Questions connexes