MultiBinding для нескольких DataTemplates с одним и тем же ItemsSource - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть два шаблона данных, которые используют мульти-привязку для управления видимостью кнопки, например, в шаблоне данных 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. Я считаю, что это способ сделать это (возможно, было бы неплохо абстрагировать это поведение в свой собственный тип).

1 Ответ

0 голосов
/ 21 ноября 2019

Будет ли wpf запускать MultiBinding конвертер HideFirstOrderedItemConverter, если изменится либо привязка к Items или Entity, либо должны измениться и Items, и Entity?

Либо. Проблема в том, что свойство Items ListBox не устанавливается при добавлении или удалении элементов из исходной коллекции. Привязать к Items.Count вместо этого:

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}"
         Path="Items.Count "/>

Это свойство будет изменяться при добавлении или удалении элементов из исходной коллекции.

Также обратите внимание, что ваше свойство Entity должно вызывать PropertyChanged событие для конвертера, которое будет повторно вызвано при его установке.

...