2011-05-01 159 views
2

我有問題綁定到LisView ObservableCollection。 問題是隻有當我從ObservableCollection中添加/刪除項目時,綁定才能正常工作。 但是當我在ObservableCollection中更改一個項目的屬性時,ListView仍顯示舊值。 我知道這是一個常見的問題,並尋找解決方案,每個人都說我應該使用BindingList而不是ObservableCollectione,因爲ObservableCollection不會傳播PropertyChanged事件和BindingList。所以我改爲了綁定列表,但問題依然存在。WPF,ObservableCollection/BindingList綁定到ListView

類:

public class Network 
{ 
    public class Layer : INotifyPropertyChanged 
    { 
     public enum ActivFunction { LINEAR, EXPONENTIAL, ARCUSTANGENT } 

     private string name; 

     public string Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
       RaisePropertyChanged("Name"); 
      } 
     } 

     public ActivFunction Activation { get; set; } 
     public int Neurons { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void RaisePropertyChanged(String propertyName) 
     { 
      if ((PropertyChanged != null)) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

    } 

    public BindingList<Layer> Layers { get; set; } 

    public Network() 
    { 
     Layers = new BindingList<Layer>(); 
    } 

    public void AddLayer(Layer layer) 
    { 
     if (Layers.Count > 0) 
     { 
      int last = Layers.Count; 
      Layers.Last().Name = "Layer " + last + " (hidden)"; 
     } 
     Layers.Add(layer); 
    } 

    public void RemoveLayer(int index) 
    { 
     if(index >= 0 && index < Layers.Count) 
      Layers.RemoveAt(index); 
    } 
} 

綁定:

<ListView Grid.Row="0" x:Name="NetworkListview" ItemsSource="{Binding network.Layers}" 
      IsSynchronizedWithCurrentItem="True"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="100" Header="layer name" 
          DisplayMemberBinding="{Binding Name}"/> 
      <GridViewColumn Width="60" Header="neurons" 
          CellTemplate="{StaticResource NeuronsTemplate}"/> 
      <GridViewColumn Width="110" Header="activation" 
          CellTemplate="{StaticResource ActivationTemplate}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

回答

7

您的集合中的項目應該是類型實現INotifyPropertyChanged接口。這樣你的listview會被通知你單個項目對象的屬性值已經改變。的ObservableCollection升CollectionChanged事件,只有當收集的變化(項目添加,刪除等)從MSDN庫文章

報價上的ObservableCollection

爲了全面支持 值從綁定源對象將數據傳輸到 約束性指標,您的 集合中支持可綁定 屬性的每個對象都必須實現 適當的屬性更改 通知機制,如 INotifyPropertyChanged接口。

是的,如果你想附加處理程序到你的子元素財產chnaged事件看這個問題的答案如何做到這一點,雖然問題有點不同,但我認爲這將符合你的目的 - Observable Collection Property Changed on Item in the Collection

1

你的財產被稱爲 「名稱」,但你通知更改爲 「名」。區分大小寫。

+0

剛要發帖:) – 2011-05-01 08:30:07

+0

這並沒有解決問題 – user606521 2011-05-01 10:31:34

+0

沒有別的跳出來,因爲我害怕顯然是錯的。只要您在PropertyChanged事件中使用了正確的值,並且您正在使用ObservableCollection,我就看不出問題所在。我在我的博客上提供了一些信息,可以爲我自己和同事調試綁定。您可能會發現它有助於獲取有關發生的更多信息。這裏是http://rtroywest.wordpress。com/2011/03/02/debugging-xaml-bindings/ – 2011-05-01 12:14:23

1

你的問題是,你必須爲名稱設置正確的屬性名

寫:

RaisePropertyChanged("Name"); 

相反的:

RaisePropertyChanged("name"); 
+0

這沒有幫助。如果事實上我之前嘗試了「名稱」,並且我更改爲「名稱」以檢查它是否有幫助。所以問題依然存在...... – user606521 2011-05-01 09:09:39

+1

假設你有另外一個問題,你使用'Name'綁定,所以傳遞的屬性名稱應該是'Name'。 – Homam 2011-05-01 09:12:22

+1

另一件事,保持ObservableCollection而不是BindingList,看看[這裏](http://stackoverflow.com/questions/4284663/difference-between-observablecollection-and-bindinglist/4284904#4284904) – Homam 2011-05-01 09:15:00

0

這有什麼好做ObservableCollectionBindinglist,如層實施INotifyPropertyChanged既會工作。只需糾正綁定。僅將DataContext設置爲Network的實例,ItemsSource="{Binding Layers}"。現在,只要您更改名稱屬性,它就會反映在ListView(測試)中。