我有一个绑定到 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>