Повторная оценка MultiConverter при изменении параметра? - PullRequest
1 голос
/ 08 ноября 2010

У меня есть список, представляющий оператор SQL WHERE, и элементы внутри могут быть сгруппированы.

Например, пользователь может иметь следующие элементы в своем ListBox

alt text

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

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Я не могу придумать, как заставить MultiConverter обновиться при изменении одного из параметров (да, он реализует INotifyPropertyChange), поэтому я просто добавил свойство к своему элементу IsBooleanOperatorShown и использовал обычный BooleanToVisibility конвертер

0 голосов
/ 08 ноября 2010

Вам необходимо вызвать событие PropertyChanged в ItemsSource объекта ListBox в ViewModel.Если ваш базовый класс ViewModel имеет метод RaisePropertyChanged или какой-либо другой помощник INOtifyPropertyChanged, поднимите его в своей коллекции - это должно заставить ListBox обновить свои данные и снова запустить их через конвертеры.

...