Как добиться функциональности 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
?