Как добиться функциональности INotifyPropertyChanged для значений в bool []?

У меня есть массив bool размером 4, и я хочу привязать каждую ячейку к другому элементу управления. Этот массив bool представляет 4 состояния (false = failure, true = success). Этот массив 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]}" ...

Проблема заключается в том, что событие notify возникает только тогда, когда я сам меняю массив и не возникает, когда я изменяю одно значение в массиве, то есть следующая строка кода вызывает событие:

Statuses = new bool[4];

но следующая строка не вызывает событие:

Statuses [0] = true;

Как я могу поднять событие каждый раз, когда изменяется одна ячейка?

Ответ 1

Вам нужно выставить свои статусы в качестве индексатора, а затем поднять событие изменения свойства, которое указывает на изменение индексатора.

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

Ответ 2

Он не вызывает событие, потому что Array сам не реализует INotifyPropertyChanged. Вы можете использовать другой контейнер, чем примитивный массив (все, что реализует INotifyCollectionChanged понравилось ObservableCollection<T>), или вы должны называть RaisePropertyChanged("Statuses") каждый раз, когда вы обновляете массив статусов ИЛИ, как указано в другом ответе, используйте один класс, реализующий INotifyPropertyChanged, содержащий 4 свойства.

Ответ 3

Вы не можете сделать это, используя Array. Изменение значения в любом индексе на Array не вызывает уведомления об изменении, требуемого UI.

Можно ли использовать класс с четырьмя свойствами, который реализует вместо этого интерфейс INotifyPropertyChanged?