2011-05-01 225 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(测试)中。