我是初学者,我试图到处寻找类似的问题,这个问题已被多次询问,但我找不到任何解决方案。
我像这样实现INotifyPropertyChanged
(它工作正常):
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
MessageBox.Show("property changed");
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
我的observablecollection
看起来像这样:
ObservableCollection<bool> Test = new ObservableCollection<bool>(new[] { false, false, false, false, false, false });
private ObservableCollection<bool> _Collection;
public ObservableCollection<bool> Collection
{
get { return _Collection = Test; }
set { _Collection = value; OnPropertyChanged("Collection"); }
}
此集合绑定到usercontrols中包含的togglebutton属性:
VidFlipX="{Binding DataContext.Collection[1], ElementName=cmix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
使用它们时数据更改正确但如果我以其他方式设置了集合,OnPropertyChanged
未触发,因此我的togglebuttons不会更新。
无法找出原因......
答案 0 :(得分:1)
更改收藏品时,您不会更改收藏品。所以你不是在打电话给你的收藏家。要更新Ui上的项目,您馆藏中的项目必须实施与here所述的INotifyPropertyChanged。
解决方案可能是这样的:
ObservableCollection<ClassA> Test { get; set; }
上课:
class ClassA : INotifyPropertyChanged
{
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if (value != _isEnabled)
{
_isEnabled = value;
OnPropertyChanged("IsEnabled");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
答案 1 :(得分:0)
你不能打电话
return _Collection = Test;
在你的Collection
属性的getter中,因为这会使setter(因而整个INotifyPropertyChanged实现)变得无用。传递给setter的value
从未在任何地方使用过。
当您需要使用预定义的集合初始化您的属性时,您可以这样做:
private ObservableCollection<bool> _Collection
= new ObservableCollection<bool>(new[] { false, false, false, false, false, false });
public ObservableCollection<bool> Collection
{
get { return _Collection; }
set { _Collection = value; OnPropertyChanged("Collection"); }
}