我有一个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>
答案 0 :(得分:0)
只需将Binding更新为
即可<Condition Binding="{Binding}" Value="Info"/>
因为它本身就是字符串。
此外,为了更好地实现此目的,您可以使用ItemTemplateSelector选择项目的模板