代码之家  ›  专栏  ›  技术社区  ›  Mark Heath

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

  •  5
  • Mark Heath  · 技术社区  · 14 年前

    <ContentPresenter Content={Binding Score} />
    

    如果分数是10,我想显示一个金星,否则只显示数字。所以实际上我有两个可能的数据模板:

    <Path Fill="Gold" Data="..." />
    
    <TextBlock Text="{Binding Score}" />
    

    最好的方法是什么?是使用绑定转换器吗?或者绑定到动态加载适当数据模板xaml并根据Score的值生成正确的FrameworkElement的不同对象?或者是我遗漏了另一个技巧——也许ContentPresenter不是正确的控件?

    <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 回复  |  直到 14 年前
        1
  •  10
  •   Muad'Dib    14 年前

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

        2
  •  1
  •   Dan Bryant    14 年前

    可能的解决方案:

    1. 使用StackPanel创建一个包含两种控件类型的数据模板,并绑定它们的可见性(或使用DataTrigger),以便一次只能看到一个。这相当简单,如果状态不多或差异很小,就可以很好地实现。

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