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)


arrow_upward
1
arrow_downward

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

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

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

person Aaron McIver    schedule 17.12.2010

arrow_upward
1
arrow_downward

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

arrow_upward
0
arrow_downward

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

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

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

person Machinarius    schedule 17.12.2010