0

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

例如,如果列表包含“信息”和“交易”,我希望列表框包含两个项目,第一个基于名为“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 属性。我尝试过“文本”,但似乎无法识别它。

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

更新

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

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

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

更新 2:

有趣的是,我发现正是我试图显示的实际最终 DataTemplates 创建了 StackOverflow 异常。谁能想到为什么以下 DataTemplate 在应用于字符串类型的 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>
4

1 回答 1

0

只需将绑定更新为

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

因为它本身就是字符串。

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

于 2013-10-02T16:01:29.983 回答