繁体   English   中英

WPF,ObservableCollection/BindingList 绑定到 ListView

[英]WPF, ObservableCollection/BindingList binding to ListView

我在将 ObservableCollection 绑定到 LisView 时遇到问题。 问题是绑定只有在我从 ObservableCollection 添加/删除项目时才能正常工作。 但是当我更改 ObservableCollection 中一项的属性时,ListView 仍然显示旧值。 我知道这是一个常见问题并寻找解决方案,每个人都说我应该使用 BindingList 而不是 ObservableCollectione,因为 ObservableCollection 不会传播 PropertyChanged 事件而 BindingList 会。 所以我改为绑定列表,但问题仍然存在。

Class:

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>

集合中的项目应该是实现 INotifyPropertyChanged 接口的类型。 这样,您的列表视图将被通知您的单个项目 object 中的属性值已更改。 ObservableCollection 仅在集合更改(添加、删除项目等)时引发 CollectionChanged 事件

引自关于 ObservableCollection 的 MSDN 库文章

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

是的,如果您想将处理程序附加到您的子元素属性 chnaged 事件,请查看这个问题的答案如何做到这一点,虽然问题有点不同,但我认为答案将满足您的目的 - Observable Collection Property Changed on Item在收藏中

您的财产被称为“名称”,但您正在通知“名称”的更改。 它区分大小写。

您的问题是您必须为名称设置正确的属性名称

写:

 RaisePropertyChanged("Name"); 

代替:

 RaisePropertyChanged("name"); 

这与ObservableCollectionBindinglist ,两者都将在 Layer 实现INotifyPropertyChanged时工作。 只需更正绑定即可。 仅将DataContext设置为 Network 和ItemsSource="{Binding Layers}"的实例。 现在,每当您更改 Name 属性时,它都会反映在ListView (已测试)中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM