WPF — флажок, привязанный к тому, содержит ли ObservableCollection значение?

В настоящее время у меня есть флажок, привязанный к свойству, которое проверяет 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}">

Заранее спасибо,
Сонни


person Sonny Boy    schedule 17.12.2010    source источник


Ответы (3)


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

ObservableCollection<T> не обновляет свойство, в котором оно возвращается; в данном случае свойство public ObservableCollection<DACharge> Charges.

Вам нужно будет зарегистрироваться на событие ObservableCollection.CollectionChanged и когда элемент добавляется/удаляется и т. д.... запускает событие PropertyChanged, как показано в предыдущей ссылке для свойства Charges.

person Aaron McIver    schedule 17.12.2010

Вам необходимо аннулировать привязку 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);
}
person devdigital    schedule 17.12.2010

Вам нужно выполнить действие «добавить элемент», чтобы запустить событие PropertyChanged интерфейса INotifyChanged, как описано здесь: http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

Если нет, то WPF никогда не узнает, когда значение изменится, поскольку источник привязки находится не в ObservableCollection, а в другом свойстве, которое вместо этого обращается к нему.

Надеюсь, поможет.

person Machinarius    schedule 17.12.2010