参数更改时重新评估MultiConverter?

时间:2010-11-08 15:55:40

标签: wpf xaml observablecollection converter

我有一个表示SQL WHERE语句的列表框,可以对里面的项进行分组。

例如,用户可以在其ListBox中包含以下项目

alt text

仅当ListBox项不是列表框中的第一项或组(如示例)时,我才想显示AND / OR值。我目前在ListBox的ItemTemplate上使用MultiConverter,它接受ListBox的ItemSource和Current Item作为参数,但是当用户添加新项目或将现有项目拖动到新项目时,现有项目不会更新其AND / OR可见性在列表框中找到。

有没有办法告诉MultiConverter在其参数之一ListBox的ItemSource发生变化时重新评估?我正在使用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>

MultiConverter接受项目列表和当前项目。它检查项目是否是列表中的第一项,或者列表中的上一项是否为GroupStart项目。如果其中任何一个条件为真,则返回Visibility.Collapsed,否则返回Visibility.Visible。

它适用于第一次加载,对单个项目所做的更改(将新项目拖动到列表框中,或将现有项目拖动到列表框中的新位置)将正确更新新项目的AND / OR可见性,但它不会更改任何其他项目,然后添加/移动的项目。因此,如果将新项目拖动到列表顶部,它将正确隐藏新项目的AND / OR,但是它不会更新第二项(前一项)以显示AND / OR。这实际上会影响列表中项目的可读性,并阻止用户查看他们当前是否正在使用AND或OR链接该项目,这会对返回的结果产生重大影响。

我很确定它与我使用MultiConverter的事实有关,因为我的DepthToMarginConverter工作正常(例如,正确分组项目会更新组内所有项目的边距)。

2 个答案:

答案 0 :(得分:0)

您需要在ViewModel中的ListBox的ItemsSource上引发PropertyChanged事件。如果您的ViewModel基类具有RaisePropertyChanged方法或其他一些INOtifyPropertyChanged帮助器,请在您的集合上引发它 - 这应该导致ListBox刷新它的数据,并再次通过转换器运行它。

答案 1 :(得分:0)

当其中一个参数发生变化时,我无法找到让MultiConverter刷新的方法(是的,它实现了INotifyPropertyChange)所以我最后只是在我的IsBooleanOperatorShown项中添加了一个属性并使用常规BooleanToVisibility转换器