В настоящее время у меня есть флажок, привязанный к свойству, которое проверяет ObservableCollection на наличие определенного значения. Если значение существует, свойство возвращает значение true.
Мое свойство и свойство, которое предоставляет ObservableCollection, доступны только для чтения.
Этот подход отлично работает, когда я впервые загружаю свою модель, но когда он добавляет дополнительные элементы в ObservableCollection, флажок, привязанный к свойству, не обновляется.
Вот код моего свойства:
public bool IsMeasure11
{
get //readonly
{
return this.Charges.Any(t => t.IsMeasure11);
}
}
А вот код моей ObservableCollection:
public ObservableCollection<DACharge> Charges
{
get //readonly
{
if (_charges == null)
{
_charges = new GenericEntityCollection<DACharge>(_DACase.Id).ToList().ToObservableCollection();
}
return _charges;
}
}
И XAML для флажка:
<CheckBox Content="M11" Name="chkM11" IsChecked="{Binding IsMeasure11, Mode=OneWay}">
Заранее спасибо,
Сонни
Ответ 1 · рейтинг 1 · Aaron McIver
Ваше свойство не реализует INotifyPropertyChanged, поэтому механизм привязки не может знать, чтобы обновить связанное свойство.
ObservableCollection<T> не обновляет свойство, в котором оно возвращается; в данном случае свойство public ObservableCollection<DACharge> Charges.
Вам нужно будет зарегистрироваться на событие ObservableCollection.CollectionChanged и когда элемент добавляется/удаляется и т. д.... запускает событие PropertyChanged, как показано в предыдущей ссылке для свойства Charges.
Ответ 2 · рейтинг 1 · devdigital
Вам необходимо аннулировать привязку IsMeasure11 (т. е. вызывать событие PropertyChanged INotifyPropertyChanged) при каждом изменении коллекции Charges. Один из способов сделать это - подписаться на событие CollectionChanged коллекции Charges.
// somewhere, maybe the constructor of your view model
this.Charges.CollectionChanged += ChargesChanged;
private void ChargesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
this.NotifyOfPropertyChanged(() => IsMeasure11);
}
Ответ 3 · Machinarius
Вам нужно выполнить действие "добавить элемент", чтобы запустить событие PropertyChanged интерфейса INotifyChanged, как описано здесь: http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
Если нет, то WPF никогда не узнает, когда значение изменится, поскольку источник привязки находится не в ObservableCollection, а в другом свойстве, которое вместо этого обращается к нему.
Надеюсь, поможет.