У меня есть два шаблона данных, которые используют мульти-привязку для управления видимостью кнопки, например, в шаблоне данных A
<Button.Visibility>
<MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="Items"/>
<Binding Path="Entity"/>
</MultiBinding>
</Button.Visibility>
и в шаблоне данных B
<Button.Visibility>
<MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="Items"/>
<Binding Path="Entity"/>
</MultiBinding>
</Button.Visibility>
Шаблоны данных привязаны к одному и тому же источнику элементов списка, и селектор шаблона данных используется для определения того, какую таблицу данных использовать, основываясь на свойстве элемента в списке (Примечание: шаблон данных является частью ItemTemplate для ListBox).
Вопрос: Будет ли wpf запускать конвертер MultiBinding HideFirstOrderedItemConverter
, если изменяется либо привязка к Items
, либо Entity
, либо оба параметра Items
и Entity
имеютизменить?
В настоящее время моя привязка к шаблону данных A не срабатывает при изменении свойства Items
(коллекция ObservableCollection, в которой элементы добавляются и удаляются) и Entity
не изменяется. В конечном итоге я хотел бы, чтобы привязка срабатывала в обоих шаблонах данных при каждом изменении свойства Items
.
Если я закомментирую привязку к Entity
в обоих шаблонах следующим образом
<Button.Visibility>
<MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="Items"/>
<!-- <Binding Path="Entity"/> -->
</MultiBinding>
</Button.Visibility>
Мой конвертер получает удар, когда я добавляю элемент в коллекцию, но только для шаблона данных, связанного с только что добавленным элементом. Я хотел бы, чтобы его ударили по всем предметам.
ОБНОВЛЕНИЕ:
Комментарии ниже @ASh и @GazTheDestroyer помогли мне понять здесь. Мне нужно уведомить мой взгляд на событие изменения коллекции, используя событие изменения свойства (события изменения коллекции НЕ отображаются в структуре привязки). Таким образом, обновив мой XAML до
<Button.Visibility>
<MultiBinding Converter="{StaticResource HideFirstOrderedItemConverter}" Mode="TwoWay">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="DataContext.Entities"/>
<Binding Path="Entity"/>
</MultiBinding>
</Button.Visibility>
, где DataContext.Entities
- это недопустимая коллекция ObservableCollection, а в привязанной модели представления хука в событие изменения коллекции этой ObservableCollection, т. Е.
Entities.CollectionChanged += CollectionChanged
где обратный вызов CollectionChanged
вызывает событие изменения свойства notify для Entities
ObservableCollection. Я считаю, что это способ сделать это (возможно, было бы неплохо абстрагировать это поведение в свой собственный тип).