2013-02-27 160 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> 

當然,你必須添加代表您在您的視圖模型列表的公共屬性。