У меня есть список, представляющий оператор SQL WHERE, и элементы внутри могут быть сгруппированы.
Например, пользователь может иметь следующие элементы в своем ListBox
Я хотел бы показать значение AND / OR, только если элемент ListBox не является первым элементом в списке или группе (как в примере). В настоящее время я использую MultiConverter в ItemTemplate ListBox, который принимает ItemSource и Current Item в ListBox в качестве параметров, однако существующие элементы не обновляют свою видимость И / ИЛИ, когда пользователь добавляет новый элемент, или перетаскивают существующий элемент в новый. место в списке.
Есть ли способ сообщить MultiConverter о необходимости переоценки при изменении одного из его параметров, ItemSource ListBox? Я использую MVVM, и ListBox привязан к ObservableCollection элементов.
Обновление
Код по просьбе Адама ...
<ListBox x:Name="WhereList" ItemsSource="{Binding Path=CurrentQuery.WhereList}">
<ListBox.Style>
<Style TargetType="{x:Type ListBox}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch"
Margin="{Binding Path=Depth, Converter={StaticResource QueryBuilder_DepthToMarginConverter}}">
<Label Content="{Binding Path=BooleanComparison}" Padding="0">
<Label.Visibility>
<MultiBinding Converter="{StaticResource ShouldShowOperatorConverter}">
<Binding ElementName="WhereList" Path="ItemsSource"/>
<Binding />
</MultiBinding>
</Label.Visibility>
</Label>
<Label Content="{Binding ConditionText}" Padding="0" HorizontalAlignment="Stretch" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Style>
</ListBox>
Мультиконвертер принимает список элементов и текущий элемент. Он проверяет, является ли элемент первым элементом в списке или предыдущий элемент в списке является элементом GroupStart. Если любое из этих условий выполняется, возвращается Visibility.Collapsed, в противном случае возвращается Visibility.Visible.
Он отлично работает при первой загрузке, и изменения, внесенные в один элемент (перетаскивание нового элемента в список или перетаскивание существующего элемента в новое место в списке), корректно обновят видимость нового элемента И / ИЛИ однако он не меняет никакой другой элемент, кроме того, который добавляется / перемещается. Поэтому, если вы перетащите новый элемент в верхнюю часть списка, он будет правильно скрывать И / ИЛИ нового элемента, однако не будет обновлять 2-й элемент (бывший первый элемент), чтобы показать И / ИЛИ. Это действительно влияет на удобочитаемость элементов в списке и не позволяет пользователю видеть, связывают ли они в настоящее время элемент с И или ИЛИ, что существенно влияет на возвращаемые результаты.
Я вполне уверен, что это как-то связано с тем, что я использую MultiConverter, поскольку мой DepthToMarginConverter работает нормально (например, группировка элементов корректно обновляет поля всех элементов в группе).