代码之家  ›  专栏  ›  技术社区  ›  Rachel

当参数改变时重新评估多转换器?

  •  1
  • Rachel  · 技术社区  · 14 年前

    我有一个表示SQL的列表框,其中语句和其中的项可以分组。

    例如,用户的列表框中可以包含以下项目

    我只想在列表框项不是列表框或组中的第一个项(如示例)时显示和/或值。我目前正在列表框的项模板上使用多转换器,它接受列表框的项源和当前项作为参数,但是当用户添加新项或将现有项拖动到列表框中的新位置时,现有项不会更新其和/或可见性。

    当列表框的itemsource参数发生变化时,是否有方法告诉multicoverter重新评估?我正在使用MVVM,并且列表框绑定到可观察的项目集合。

    更新 按亚当的要求编写代码…

    <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)。

    例如,用户的列表框中可以包含以下项目

    alt text

    我只想在列表框项不是列表框或组中的第一个项(如示例)时显示和/或值。我目前正在列表框的项模板上使用多转换器,它接受列表框的项源和当前项作为参数,但是当用户添加新项或将现有项拖动到列表框中的新位置时,现有项不会更新其和/或可见性。

    当列表框的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工作正常(例如,正确分组项目会更新组中所有项目的边距)。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Adam Barney    14 年前

        2
  •  0
  •   Rachel    14 年前

    MultiConverter INotifyPropertyChange BooleanToVisibility