我有一个表示SQL WHERE语句的列表框,可以对里面的项进行分组。
例如,用户可以在其ListBox中包含以下项目
仅当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工作正常(例如,正确分组项目会更新组内所有项目的边距)。
答案 0 :(得分:0)
您需要在ViewModel中的ListBox的ItemsSource上引发PropertyChanged事件。如果您的ViewModel基类具有RaisePropertyChanged方法或其他一些INOtifyPropertyChanged帮助器,请在您的集合上引发它 - 这应该导致ListBox刷新它的数据,并再次通过转换器运行它。
答案 1 :(得分:0)
当其中一个参数发生变化时,我无法找到让MultiConverter
刷新的方法(是的,它实现了INotifyPropertyChange
)所以我最后只是在我的IsBooleanOperatorShown项中添加了一个属性并使用常规BooleanToVisibility
转换器