如何在WPF数据触发器中使用字符串可观察集合的实际值?

时间:2013-10-02 15:53:38

标签: wpf listbox datatemplate listboxitem

我有一个ObservableCollection绑定到WPF中的列表框,该集合包含我想在数据触发器中使用的字符串值,以确定为ListBoxItem显示的DataTemplate。

例如,如果List包含“Info”和“Trades”,我希望ListBox包含两个项目,第一个基于名为“InfoTemplate”的模板,第二个基于名为“TradesTemplate”的模板

我应用于ListBox的样式是

<Style TargetType="{x:Type ListBox}" x:Key="ResultsTypeTemplate" >
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <ContentControl Content="{Binding}">
                        <ContentControl.Style>
                            <Style TargetType="{x:Type ContentControl}">
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding Text}" Value="Info" />
                                        </MultiDataTrigger.Conditions>
                                        <Setter Property="ContentTemplate" Value="{DynamicResource InfoResultTypeTemplate}"/>
                                    </MultiDataTrigger>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding Text}" Value="Trades" />
                                        </MultiDataTrigger.Conditions>
                                        <Setter Property="ContentTemplate" Value="{DynamicResource TradesResultTypeTemplate}"/>
                                    </MultiDataTrigger>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">
                                        <Setter Property="Background" Value="White"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </DataTemplate>
            </Setter.Value>
        </Setter>

问题在于我认为我没有针对多数据触发条件的正确Binding属性。我试过“文字”,但似乎没有认出来。

当我使用类型为“string”的Observable集合时,如何在查看Item模板时获取字符串本身的值?我只试过{Binding}但是进入了一个无限循环

更新

<Setter Property="ContentTemplate" Value="{DynamicResource InfoResultTypeTemplate}"/>

<Setter Property="Foreground" Value="White" />

就像测试一样,它运行正常。所以它通过触发器设置ContentTemplate然后创建一个无限循环,所以显然在这里设置ContentTemplate然后触发另一个触发器或检查。

更新2:

有趣的是,我发现这是我试图显示的实际最终DataTemplates,它们正在创建StackOverflow异常。任何人都可以想到为什么以下DataTemplate在应用于string类型的ListBoxItem时会创建该异常?

<DataTemplate x:Key="TradesResultTypeTemplate">
    <Border x:Name="Border" CornerRadius="4" BorderThickness="2" Background="{StaticResource MenuButtonBackground}" BorderBrush="{StaticResource ResultProcessedBorder}">
        <ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True" />
    </Border>
</DataTemplate>

1 个答案:

答案 0 :(得分:0)

只需将Binding更新为

即可
<Condition Binding="{Binding}" Value="Info"/>

因为它本身就是字符串。

此外,为了更好地实现此目的,您可以使用ItemTemplateSelector选择项目的模板