2013-02-27 211 views
0

我有最糟糕的时间搞清楚了。我必须使用我还没完全理解的MVVM,并将填充了SQL数据的列表绑定到radGridView。听起来很容易......但我无法弄清楚。数据不显示,我认为这是因为我绑定它是错误的。以下是我的相关代码。任何帮助,将不胜感激!将GridView绑定到列表

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

一定要将'View'的'DataContext'属性设置为'ViewModel'。 offtopic:不要忘记关闭'sqlConnection' – Nogard 2013-02-27 14:56:01

+0

你'while'loop似乎很奇怪。你想把桌子弄平吗? – 2013-02-27 14:56:36

+0

这可能很奇怪哈哈,但是,不。基本上我不挑剔如何做到这一点。我只需要使用MVVM并将来自sql的数据放入数据网格中。 @Nogard感谢您提醒我关闭连接,并设置了DataContext属性。 – JLott 2013-02-27 15:00:04

回答

2

全部公共财产可以帮助你,在根级别您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 
//.... 
} 

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

和方法内

+0

那么我的XAML现在还能工作吗? – JLott 2013-02-27 15:14:35

+0

尝试之前永远不会知道 - 但应该。 – Nogard 2013-02-27 15:16:20

+0

好吧,它绑定正确。这可能是因为我使用了一个列表,并按照Hamlet所说的将其扁平化,而不是GridView中每列的数据都显示在行中。任何快速修复?或者我应该需要创建一个单独的问题? – JLott 2013-02-27 15:17:00

2
List<String> dataList = new 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); 
    } 
+0

那么喜欢get或set?我更新了我的问题,以包含更多我的VeiwModel代码。 – JLott 2013-02-27 15:00:44

1

MVVM绑定可以在ViewModel中使用公共属性...

此外,它也可以打赌如果可能的话绑定到Observable集合。

为此,您需要使用以下代码;

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

OnPropertyChanged子引发INotifiyPropertyChanged事件,这样对收集的任何变化都在你的GridView自动反映。

你需要创建这个子,但是如果你想,你可以直接在Setter中引发这个事件。

然后您的代码将会;

_Details = new ObserservableCollection<string>(); 

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

您的XAML将保持与上述相同。

0

尝试,当你初始化视图设置的DataContext的视图模型

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

view.DataContext = viewModel; 

的其他解决办法是设置在你的查看DataContex。 但是,您必须告诉您查看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> 

当然,你必须添加代表您在您的视图模型列表的公共属性。