如何为bool []中的值实现INotifyPropertyChanged功能?

时间:2011-01-05 13:50:55

标签: wpf binding inotifypropertychanged

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

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]}" ...

问题是只有当我更改数组本身时才会引发通知事件,而当我更改数组中的一个值时,不会引发通知事件,即下一个代码行引发事件:

Statuses = new bool[4];

但下一行不会引发事件:

Statuses [0] = true;

每次更换一个单元格时,如何引发事件?

3 个答案:

答案 0 :(得分:8)

您需要将状态公开为索引器,然后引发一个属性更改事件,指示索引器已更改。

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));
    }
}

请参阅此博文:

http://10rem.net/blog/2010/03/08/wpf---silverlight-quick-tip-inotifypropertychanged-for-indexer

答案 1 :(得分:3)

它不会引发事件,因为Array本身并没有实现INotifyPropertyChanged。您可以使用与原始数组不同的容器(任何实现INotifyCollectionChanged ObservableCollection<T> RaisePropertyChanged("Statuses")应该执行的操作)或者每次更新状态数组时都必须调用INotifyPropertyChanged,如提到的那样在另一个答案中,使用一个实现包含4个属性的{{1}}的类。

答案 2 :(得分:1)

使用Array时无法执行此操作。更改Array上任意索引处的值不会引发UI所需的更改通知。

您可以使用具有四个实现INotifyPropertyChanged接口的属性的类吗?