[英]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");
這與ObservableCollection
或Bindinglist
,兩者都將在 Layer 實現INotifyPropertyChanged
時工作。 只需更正綁定即可。 僅將DataContext
設置為 Network 和ItemsSource="{Binding Layers}"
的實例。 現在,每當您更改 Name 屬性時,它都會反映在ListView
(已測試)中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.