![](/img/trans.png)
[英]Update view when item's property of ObservableCollection is changed
[英]How to make an ObservableCollection update when an item property is changed
我已经看过这个问题很多次了(并回答了),但我似乎仍然无法弄清楚我所缺少的是什么...
我有一个带有复选框列表的窗口,我希望能够从后台隐藏代码动态地启用/禁用列表中的复选框。 为此,我有几个单选按钮,它们调用一个代码隐藏函数来切换VisibleFeatures集合中第一个条目的“ Enabled”属性。 理想情况下,这将导致第一个复选框+文本启用/禁用,但不会发生UI更改。
我究竟做错了什么?
ViewModel:
public class MyFeature
{
private bool _supported;
private bool _enabled;
private bool _selected;
public string Name { get; set; }
public bool Supported
{
get { return _supported; }
set { _supported = value; NotifyPropertyChanged("Supported"); }
}
public bool Enabled
{
get { return _enabled; }
set { _visible = value; NotifyPropertyChanged("Enabled"); }
}
public bool Selected
{
get { return _selected; }
set { _selected = value; NotifyPropertyChanged("Selected"); }
}
public MyFeature(string name)
{
Name = name;
_supported = false;
_enabled = false;
_selected = false;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public ObservableCollection<MyFeature> VisibleFeatures { get; set; }
void VisibleFeatures_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
foreach (MyFeature item in e.NewItems)
item.PropertyChanged += MyFeature_PropertyChanged;
if (e.OldItems != null)
foreach (MyFeature item in e.OldItems)
item.PropertyChanged -= MyFeature_PropertyChanged;
}
void MyFeature_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// NotifyPropertyChanged() defined again elsewhere in the class
NotifyPropertyChanged("VisibleFeatures");
}
public Init()
{
VisibleFeatures = new ObservableCollection<MyFeature>();
VisibleFeatures.CollectionChanged += VisibleFeatures_CollectionChanged;
VisibleFeatures.Add(new MyFeature("Feature1"));
VisibleFeatures.Add(new MyFeature("Feature2"));
...
}
XAML:
<StackPanel>
<ListView ItemsSource="{Binding VisibleFeatures}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel IsEnabled="{Binding Enabled, Mode=TwoWay}">
<CheckBox IsChecked="{Binding Selected, Mode=TwoWay}">
<TextBlock Text="{Binding Name}" />
</CheckBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListView>
</StackPanel>
您的类MyFeature需要声明它实现了INotifyPropertyChanged
接口。 否则,XAML将不会生成任何侦听器来侦听您的属性更改通知。
此外,从您的示例中,我看不到通知VisibleFeatures
更改。
从INotifyPropertyChanged接口派生您的类“ MyFeature”。
为了反映视图中可观察集合中所做的运行时更改,必须从INotifyPropertyChanged接口派生viewmodel类(此处为MyFeature类)。
另外,建议在任何使用绑定属性的地方都使用相同的实例,而不要创建新的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.