2017-08-16 78 views
0

我有我的觀點一個按鈕,在視圖模型執行此方法:的DataGrid不綁定到的ObservableCollection

public void GetAudits(Guid? userId, DateTime? from, DateTime? to, string form) 
     { 
      StringBuilder sCondition = new StringBuilder("WHERE 0=0"); 

      if (userId != null && userId != Guid.Empty) 
       sCondition.Append(string.Format(" AND UserId = '{0}' ", userId)); 

      if (!string.IsNullOrEmpty(form)) 
       sCondition.Append(string.Format(" AND FormName = '{0}' ", form)); 


      string query = string.Format("SELECT * FROM Common.TbHistoryLog {0}", sCondition); 
      Audits = new ObservableCollection<HistoryLog>(oContext.Database.SqlQuery<HistoryLog>(query).ToList()); 

     } 

Audits屬性:

public ObservableCollection<HistoryLog> Audits 
    { 
     get 
     { 
      return audits; 
     } 
     set 
     { 
      audits = value; 
     } 
    } 
    ObservableCollection<HistoryLog> audits; 

,這是爲處理程序按鈕:

private void BtnSearch(object sender, RoutedEventArgs e) 
     { 
      var userId = ((TbUsers)cmbUsers.SelectedItem)?.UserId; 
      var from = dtFromDate.Value; 
      var to = dtToDate.Value; 
      var form = ((BlCommon.TbObjects)cmbForms.SelectedItem)?.ObjectRealName; 
      using (ClsUserTransactions oUserTrans = new ClsUserTransactions()) 
      { 
       oUserTrans.GetAudits(userId, from, to, form); 
      } 
     } 

但是當我點擊按鈕,dataGrid沒有得到更新與th Ë審計收集:

<DataGrid Name="gvHistory" Grid.Column="0" Grid.Row="9" Margin="2" Visibility="Visible" ItemsSource="{Binding Audits}" Grid.ColumnSpan="8" IsReadOnly="True" Grid.RowSpan="2" AutoGenerateColumns="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CanUserAddRows="False"/> 

當我調試,我注意到,吸氣塊不打

+1

在ViewModel中實現INotifyPropertyChanged,並在setter中爲「審計」屬性提出PropertyChanged事件 – ASh

+0

可觀察集合屬性應爲只讀。他們向用戶界面提供更改通知。添加和刪​​除集合中的元素,請勿替換集合。 – Will

回答

0

您的視圖模型應該實現INotifyPropertyChanged接口,然後通知對審計二傳手屬性變化:

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
... 

-

public ObservableCollection<HistoryLog> Audits 
{ 
    get 
    { 
     return audits; 
    } 
    set 
    { 
     audits = value; 
     OnPropertyChanged("Audits"); 
    } 
} 
ObservableCollection<HistoryLog> audits; 
+0

它不起作用 –

1

你爲什麼不SIMPL Ÿ明確和重新填充相同ObservableCollection

public void GetAudits(Guid? userId, DateTime? from, DateTime? to, string form) 
{ 
    StringBuilder sCondition = new StringBuilder("WHERE 0=0"); 

    if (userId != null && userId != Guid.Empty) 
     sCondition.Append(string.Format(" AND UserId = '{0}' ", userId)); 

    if (!string.IsNullOrEmpty(form)) 
     sCondition.Append(string.Format(" AND FormName = '{0}' ", form)); 


    string query = string.Format("SELECT * FROM Common.TbHistoryLog {0}", sCondition); 
    if (Audits != null) 
    { 
     Audits.Clear(); 
     var newItems = oContext.Database.SqlQuery<HistoryLog>(query).ToList(); 
     if (newItems != null) 
      foreach (var newItem in newItems) 
       Audits.Add(newItem); 
    } 
} 

其次,這將創建一個新實例ClsUserTransactions的:

ClsUserTransactions oUserTrans = new ClsUserTransactions()) 

您需要將項目添加到一個該DataGrid是綁定以及你肯定不應該立即處理實例後,你已經填充其審計集合...:

private void BtnSearch(object sender, RoutedEventArgs e) 
{ 
    var userId = ((TbUsers)cmbUsers.SelectedItem)?.UserId; 
    var from = dtFromDate.Value; 
    var to = dtToDate.Value; 
    var form = ((BlCommon.TbObjects)cmbForms.SelectedItem)?.ObjectRealName; 
    ClsUserTransactions oUserTrans = gvHistory.DataContext as ClsUserTransactions; 
    oUserTrans.GetAudits(userId, from, to, form); 
} 
相關問題