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

时间:2010-11-09 17:58:48

标签: wpf silverlight data-binding datatemplate

说我正在使用WPF或Silverlight并将ContentPresenter绑定到整数属性:

<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>

2 个答案:

答案 0 :(得分:10)

你可以使用模板选择器。 Here is a nice tutorial on Switch On The Code。基本上,模板选择器允许您根据所需的条件选择项目的模板。

答案 1 :(得分:1)

可能的解决方案:

  1. 使用包含两种控件类型的StackPanel创建一个DataTemplate,并绑定它们的Visibility(或使用DataTrigger),这样一次只能看到一个。这很简单,如果状态不多或差异很小,可能会很好。

  2. 使用DataTemplateSelector并按资源查找DataTemplate。