Wpf 如何为布尔[]中的值实现INotifyPropertyChanged功能?
我有一个大小为4的bool数组,我想将每个单元格绑定到不同的控件。 此布尔数组表示4种状态(假=失败,真=成功)。 此布尔数组是一个具有类的属性:Wpf 如何为布尔[]中的值实现INotifyPropertyChanged功能?,wpf,binding,inotifypropertychanged,Wpf,Binding,Inotifypropertychanged,我有一个大小为4的bool数组,我想将每个单元格绑定到不同的控件。 此布尔数组表示4种状态(假=失败,真=成功)。 此布尔数组是一个具有类的属性: class foo : INotifyPropertyChanged { ... private bool[] _Statuses; public bool[] Statuses { get {return Statuses;} set { Statuses = value; OnPro
class foo : INotifyPropertyChanged {
...
private bool[] _Statuses;
public bool[] Statuses
{
get {return Statuses;}
set {
Statuses = value;
OnPropertyChanged("Statuses");
}
}
在XAML中有4个控件,每个控件绑定到数组的一个单元格:
... Text="{Binding Path=Statuses[0]}" ...
... Text="{Binding Path=Statuses[1]}" ...
... Text="{Binding Path=Statuses[2]}" ...
... Text="{Binding Path=Statuses[3]}" ...
问题是,仅当我更改数组本身时才会引发notify事件,而当我更改数组中的一个值时(即,下一代码行引发事件)不会引发notify事件:
Statuses = new bool[4];
Statuses [0] = true;
但下一行不会引发事件:
Statuses = new bool[4];
Statuses [0] = true;
如何在每次更改一个单元格时引发事件?它不会引发事件,因为
数组本身未实现INotifyPropertyChanged
。您可以使用与基元数组不同的容器(任何实现INotifyCollectionChanged
的容器都应该这样做),或者您必须在每次更新Statuses数组时调用RaisePropertyChanged(“Statuses”)
,或者如另一个答案中所述,使用一个类来实现包含4个属性的INotifyPropertyChanged
。使用数组时无法执行此操作。更改数组
上任何索引处的值不会引发UI
所需的更改通知
是否可以使用具有四个属性的类来实现
INotifyPropertyChanged
接口?您需要将状态公开为索引器,然后引发一个属性更改事件,指示索引器已更改
private bool[] _Statuses;
public bool this[int index]
{
get { return _Statuses[index]; }
set
{
_Statuses[index] = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(Binding.IndexerName));
}
}
请参阅此博客帖子:
是的,使用ObservaleCollection将是最简单的方法。
ObservaleCollection
不会在其中任何项目的值发生更改时通知。@decyclone:它会通知集合的第n个项目是否被移动、替换等,OP的代码就是这样做的。您是对的,因为这不会处理t具有属性且未实现INotifyPropertyChanged的情况,但我认为这超出了问题的范围。您是对的。我没有意识到这将是一个值类型(布尔值)的集合,而不是一个类。在引发属性更改事件时,您错过了一个括号。