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

5

假设我正在使用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>

嗨,Mark Heath,好问题,但真的没有答案,请让我知道你是否解决了它。 - Mohsen
2个回答

10

1
非常有用的教程。我不知怎么错过了DataTemplateSelector - Mark Heath
是的,对于像模板化列表项这样的事情,DTS也非常好。 - Muad'Dib
1
这是一个完美的例子,解释了为什么SO上不赞成仅包含链接的答案。 - Wobbles

1
可能的解决方案:
  1. 创建一个包含两种控件类型的StackPanel的DataTemplate,并绑定它们的可见性(或使用DataTrigger),以便一次只显示一个。这很简单,如果状态不多或差异很小,则可以很好地工作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接