2011-01-07 5 views
0

Ich versuche, Artikel zu einer Liste wie unten zu sehen, und das DataGrid zu aktualisieren, aber es scheint, dass ich etwas vermisse, welche Eigenschaft sollte ich benachrichtigen?Notify Änderungen in der Liste wpf .net4.0

C#

public partial class Window8 : INotifyPropertyChanged 
    { 
     public TestObj TestObject { get; set; } 
     public int Count { get; set; } 

     public Window8() 
     { 
      InitializeComponent(); 
      DataContext = this; 

      var newList = new List<Test>(); 

      newList.Add(new Test{I = 1, S = "Test"}); 
      TestObject = new TestObj { S = "Testing object", List = newList }; 

      Count = TestObject.List.Count; 
     } 


     private ICommand _addItemCommand; 
     public ICommand AddItemCommand 
     { 
      get 
      { 
       if (_addItemCommand == null) 
        _addItemCommand = new RelayCommand(n => 
                  { 
                   TestObject.List.Add(new Test {I = 1, S = "New object"}); 
                   Count = TestObject.List.Count; 

                   NotifyPropertyChanged("TestObject"); 
                   //NotifyPropertyChanged("TestObject.List"); 

                   NotifyPropertyChanged("Count"); 

                  }); 
       return _addItemCommand; 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 


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

    public class TestObj 
    { 
     public string S { get; set; } 
     public List<Test> List { get; set; } 
    } 

    public class Test 
    { 
     public string S { get; set; } 
     public int I { get; set; } 
    } 

XAML

<StackPanel> 
     <Button Height="23" Width="100" Command="{Binding Path=AddItemCommand}" >Add Item</Button> 
     <DataGrid Height="100" ItemsSource="{Binding Path=TestObject.List}" IsReadOnly="True" /> 
<TextBlock Text="{Binding Path=Count}" /> 

Wenn ich drücken Sie die Taste i Objekte in der Liste hinzufügen, zählt der Zähler nach oben, aber nichts passiert in der Liste.

Antwort

3

Sie eine ObservableCollection statt einer Liste

-Code

public Window8() 
{ 
    InitializeComponent(); 
    DataContext = this; 

    var newList = new ObservableCollection<Test>(); 

    newList.Add(new Test { I = 1, S = "Test" }); 
    TestObject = new TestObj { S = "Testing object", List = newList }; 

    Count = TestObject.List.Count; 
} 

public class TestObj 
{ 

    public string S { get; set; } 
    public ObservableCollection<Test> List { get; set; } 
} 

auch INotifyPropertyChanged auf die Objekte nicht im Fenster umgesetzt werden sollten

BE- Sollte verwenden sollten
0

Sie "Objekte" müssen INotifyPropertyChanged implementieren, nicht das Formular oder das Fenster.