2014-06-13 80 views
0

更新我已經實施了DataGrid如下:數據網格不與的ObservableCollection

<DataGrid Name="grdSignals" Grid.Column="1" ItemsSource="{Binding}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Signal Name" Binding="{Binding SignalName}"/> 
     <DataGridTextColumn Header="Value" Binding="{Binding SignalValue}" /> 
    </DataGrid.Columns> 
</DataGrid> 

以下是Class其中我實現在一個ObservableCollection使用的屬性:

namespace Test 
{ 
    public partial class MyMain : UserControl 
    {   
     public ObservableCollection<Signals> ocSignalNames; 
     Signals time, mode; 

     public MyMain() 
     { 
      InitializeComponent();  
      ocSignalNames = new ObservableCollection<Signals>();    
      time = new Signals() { SignalName = "Time", SignalValue = "" }; 
      mode = new Signals() { SignalName = "Mode", SignalValue = "" }; 
      ocSignalNames.Add(time); 
      ocSignalNames.Add(mode); 
      grdSignals.DataContext = ocSignalNames; 
     } 
    } 

    public class Signals : INotifyPropertyChanged 
    { 
     string _signalName, _signalValue; 
     public string SignalName 
     { 
      get 
      { 
       return _signalName; 
      } 
      set 
      { 
       _signalName = value; 
      } 
     } 

     public string SignalValue 
     { 
      get 
      { 
       return _signalValue; 
      } 
      set 
      { 
       _signalValue = value; 
       OnPropertyChanged(SignalValue); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

調試之後,我發現ocSignalNames在其項目更改時正在更新。但是這些更改沒有反映在DataGrid中。我正在更新線程中的項目,如下所示:

time.SignalValue = iTest1.ToString(); 
mode.SignalValue = iTest2.ToString(); 

我錯過了什麼?

+1

觀察集合只通知有關集合中的變化,不是在內部集合項目的變化。 – Silvermind

+0

那是線程'UIThread'還是'NonUIThread'? –

+0

這是一個NonUIThread – Abhishek

回答

0

你缺少正確的NotifyChanged處理程序:

public string SignalName 
    { 
     get 
     { 
      return _signalName; 
     } 
     set 
     { 
      _signalName = value; 
      OnPropertyChanged("SignalName"); //Added 
     } 
    } 

    public string SignalValue 
    { 
     get 
     { 
      return _signalValue; 
     } 
     set 
     { 
      _signalValue = value; 
      OnPropertyChanged("SignalValue"); //NOTE: quotation marks added 
     } 
    } 
+0

嗯,我不需要'SignalName'屬性來更新。只有'SignalValue'。它在ObservableCollection中得到更新。 – Abhishek

+0

您在代碼中缺少引號:'OnPropertyChanged(SignalValue)'與'OnPropertyChanged(「SignalValue」)'。 –

+0

*它在ObservableCollection中得到更新。*這裏沒有什麼關係了......通知PropertyChanged事件的更改會更新UI,而且你目前似乎沒有這樣做。 – Sheridan

0

你必須使用下面提到的代碼。

string _signalName, _signalValue; 
    public string SignalName 
    { 
     get 
     { 
      return _signalName; 
     } 
     set 
     { 
      _signalName = value; 
      OnPropertyChanged("SignalName"); 
     } 
    } 

    public string SignalValue 
    { 
     get 
     { 
      return _signalValue; 
     } 
     set 
     { 
      _signalValue = value; 
      OnPropertyChanged(SignalValue); 
     } 
    } 

你的XAML的樣子

<DataGrid Name="grdSignals" Grid.Column="1" ItemsSource="{Binding}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Signal Name" Binding="{Binding SignalName, Mode=TwoWay}"/> 
      <DataGridTextColumn Header="Value" Binding="{Binding SignalValue, Mode=TwoWay}" /> 
     </DataGrid.Columns> 
    </DataGrid> 

O/P

enter image description here

+0

這裏有什麼不同,我發佈的答案? – Sajeetharan

+0

OP評論說它沒有工作,所以我已經在我的ans中給他顯示了完整的路徑和輸出 –

相關問題