Wpf 如何为布尔[]中的值实现INotifyPropertyChanged功能?

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

我有一个大小为4的bool数组,我想将每个单元格绑定到不同的控件。 此布尔数组表示4种状态(假=失败,真=成功)。 此布尔数组是一个具有类的属性:

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的情况,但我认为这超出了问题的范围。您是对的。我没有意识到这将是一个值类型(布尔值)的集合,而不是一个类。在引发属性更改事件时,您错过了一个括号。