<listbox x:name=“WhereList”itemssource=“绑定路径=currentQuery.WhereList”>
<listbox.style>
<style targettype=“x:类型列表框”>
<setter property=“itemtemplate”>
<setter.value>
<数据模板>
<stackpanel orientation=“horizontal”horizontallight=“拉伸”
Margin=“绑定路径=深度,Converter=StaticResource QueryBuilder_DepthToMarginConverter”>
<label content=“绑定路径=booleancomparison”padding=“0”>
<label.visibility>
<multibinding converter=“staticresource shouldshowoperatorconverter”>
<binding elementname=“wherelist”path=“itemssource”/>
<绑定/>
</multibinding>
</label.visibility>
&标签/标签;
<label content=“绑定条件文本”padding=“0”horizontallight=“stretch”/>gt;
</stackpanel>
</datatemplate>
</setter.value>
&;
&风格/风格;
</listbox.style>
</listbox>
< /代码>
多转换器接受项目列表和当前项目。它检查项目是否是列表中的第一个项目,或者列表中的前一个项目是否是GroupStart项目。如果其中一个条件为真,则返回visibility.collapsed,否则返回visibility.visible.
它在第一次加载时工作正常,对单个项所做的更改(将新项拖到列表框中,或将现有项拖到列表框中的新位置)将正确更新新项的和/或可见性,但它不会更改任何其他项,然后添加/移动该项。因此,如果将新项目拖到列表顶部,它将正确隐藏新项目的和/或,但不会更新第二个项目(前第一个项目)以显示和/或。这确实会影响列表中项目的可读性,并阻止用户查看他们当前是否正在将项目与“和”或“或”链接,这会使返回的结果产生很大的差异。
我相当肯定这与我使用多个转换器的事实有关,因为我的DepthToMarginConverter工作正常(例如,Grouping items correctly updates the margin of all items within the group)。
例如,用户的列表框中可以包含以下项目
我只想在列表框项不是列表框或组中的第一个项(如示例)时显示和/或值。我目前正在列表框的项模板上使用多转换器,它接受列表框的项源和当前项作为参数,但是当用户添加新项或将现有项拖动到列表框中的新位置时,现有项不会更新其和/或可见性。
当列表框的itemsource参数发生变化时,是否有方法告诉multicoverter重新评估?我正在使用MVVM,并且列表框绑定到可观察的项集合。
更新
按亚当的要求编写代码…
<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。
它在第一次加载时工作正常,对单个项所做的更改(将新项拖到列表框中,或将现有项拖到列表框中的新位置)将正确更新新项的和/或可见性,但它不会更改任何其他项,然后添加/移动该项。因此,如果将新项目拖到列表顶部,它将正确隐藏新项目的和/或,但不会更新第二个项目(前第一个项目)以显示和/或。这确实会影响列表中项目的可读性,并阻止用户查看他们当前是否正在将项目与“和”或“或”链接,这会对返回的结果产生很大影响。
我相当肯定这与我使用多转换器的事实有关,因为我的DepthToMarginConverter工作正常(例如,正确分组项目会更新组中所有项目的边距)。