WPF,ObservableCollection/BindingList绑定到ListView

use*_*521 2 c# wpf

我有问题将ObservableCollection绑定到LisView.问题是只有当我从ObservableCollection中添加/删除项目时,Binding才能正常工作.但是当我在ObservableCollection中更改一个项的属性时,ListView仍然显示旧值.我知道这是一个普遍的问题,寻找解决的办法,大家说,我应该使用的BindingList ObservableCollectione的,因为的ObservableCollection不传播的PropertyChanged事件和做的BindingList.所以我改为绑定列表,但问题仍然存在.

类:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

捆绑:

<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>
Run Code Online (Sandbox Code Playgroud)

Roh*_*ats 7

集合中的项应该是实现INotifyPropertyChanged接口的类型.这样,您的列表视图将通知您单个项目对象中的属性值已更改.ObservableCollection仅在集合更改(添加,删除项目等)时才会上升CollectionChanged事件

从关于ObservableCollection的MSDN库文章引用

要完全支持将数据值从绑定源对象传输到绑定目标,集合中支持可绑定属性的每个对象都必须实现适当的属性更改通知机制,例如INotifyPropertyChanged接口.

是的,如果你想把处理程序附加到你的子元素属性chnaged事件看看这个问题的答案怎么做,虽然问题有点不同,但我认为答案将满足你的目的 - Observable Collection属性更改项目在收藏中