基于Silverlight/WPF中绑定数据的值切换数据模板

基于Silverlight/WPF中绑定数据的值切换数据模板,wpf,silverlight,data-binding,datatemplate,Wpf,Silverlight,Data Binding,Datatemplate,假设我正在使用WPF或Silverlight并将ContentPresenter绑定到integer属性: <ContentPresenter Content={Binding Score} /> 如果分数是10,我想显示一个金星,否则只显示数字。因此,基本上我有两个可能的数据模板: <Path Fill="Gold" Data="..." /> <TextBlock Text="{Binding Score}" /> 设置此项的最佳方法是什么?

假设我正在使用WPF或Silverlight并将ContentPresenter绑定到integer属性:

<ContentPresenter Content={Binding Score} />

如果分数是10,我想显示一个金星,否则只显示数字。因此,基本上我有两个可能的数据模板:

<Path Fill="Gold" Data="..." />

<TextBlock Text="{Binding Score}" />

设置此项的最佳方法是什么?是否使用绑定转换器?或者绑定到另一个对象,该对象动态加载适当的数据模板xaml,并根据Score的值生成正确的FrameworkElement?或者是我缺少了另一个技巧——也许ContentPresenter不是应该使用的控件

我想知道您是否可以这样做,但它不喜欢ContentTemplate值中的嵌套绑定:

<StackPanel>
    <StackPanel.Resources>
        <DataTemplate x:Key="LowScore">
            <TextBlock Text="{Binding Path=Score}" Foreground="Red" />
        </DataTemplate>
        <DataTemplate x:Key="HighScore">
            <Path Fill="Gold" Data="M 0,0 l 10,0 l 5,-10 l 5,10 l 10,0 l -7,10 l 2,10 l -10,-5 l -10,5 l 2,-10 Z" />
        </DataTemplate>

    </StackPanel.Resources>
    <ContentPresenter Content="{Binding Score}" ContentTemplate="{StaticResource ResourceKey={Binding ScoreTemplate}}">
    </ContentPresenter>
</StackPanel>

您可以使用模板选择器。基本上,模板选择器允许您根据所需的任何条件为项目选择模板

可能的解决方案:

  • 使用包含这两种控件类型的StackPanel创建DataTemplate,并绑定它们的可见性(或使用DataTrigger),以便一次只能看到一种。这是相当简单的,如果州不多或差异很小,这可能是好的

  • 使用DataTemplateSelector并按资源查找DataTemplate


  • 非常有用的教程。不知怎的,我错过了
    DataTemplateSelector
    是的,dts在模板列表项目方面也非常好。这是为什么只链接的答案不受欢迎的一个很好的例子。嗨,马克·希思,问得好,但真的没有答案,如果你找到了,请告诉我。