簡體   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