为同一模型指定datatemplate,但为不同的控件

时间:2015-09-24 15:44:10

标签: c# .net wpf datatemplate

例如我们有:

public class CmdData  
{
    public CmdData(String text)
    {
        Text = text;
    }

    public CmdData(String text, ICommand command): this(text)
    {
        Command = command;
    }

    public String Text { get; set; }
    public ICommand Command { get; set; }


}

它用作MenuItem的模型。 接下来,我将生成新实体CheckableCmdData(:CmdData),并希望在ToolBar和Menu中使用它们。

在菜单中CheckableCmdData是一个IsIckable =“True”的MenuItem。在工具栏中,它是一个CheckBox。

我有一个DataTemplate For Menu 为同一模型创建DataTemplate的适当方法是什么,但对于不同的控件,或者我应该使用样式吗?

2 个答案:

答案 0 :(得分:0)

您可以创建单独的数据模板,为它们分配不同的资源键,并为特定控件应用适当的模板。

<DataTemplate x:Key="MenuCmdDataTemplate"
              DataType="{x:Type local:CmdData}">
    <TextBlock Text="{Binding Text}" />
</DataTemplate>
<DataTemplate x:Key="MenuCheckableCmdDataTemplate"
              DataType="{x:Type local:CheckableCmdData}">
    <StackPanel Orientation="Horizontal">
        <CheckBox IsChecked="{Binding IsChecked}"/>
        <TextBlock Text="{Binding Text}" />
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="ToolBarCmdDataTemplate"
              DataType="{x:Type local:CmdData}">
    <TextBlock Text="{Binding Text}"
               Foreground="Red"/>
</DataTemplate>
<DataTemplate x:Key="ToolBarCheckableCmdDataTemplate"
              DataType="{x:Type local:CheckableCmdData}">
    <StackPanel Orientation="Horizontal">
        <CheckBox IsChecked="{Binding IsChecked}"/>
        <TextBlock Text="{Binding Text}"
                   Foreground="Green"/>
    </StackPanel>
</DataTemplate>

用法:

<StackPanel>
    <ToolBar VerticalAlignment="Top">
        <Button Content="{Binding}"
                ContentTemplate="{StaticResource ToolBarCmdDataTemplate}"
                DataContext="{Binding CmdData1}"/>
        <Button Content="{Binding}"
                ContentTemplate="{StaticResource ToolBarCheckableCmdDataTemplate}"
                DataContext="{Binding CmdData2}"/>
    </ToolBar>
    <Menu VerticalAlignment="Top">
        <MenuItem Header="Group">
            <MenuItem HeaderTemplate="{StaticResource MenuCmdDataTemplate}"
                      DataContext="{Binding CmdData1}"
                      Header="{Binding}"/>
            <MenuItem HeaderTemplate="{StaticResource MenuCheckableCmdDataTemplate}"
                      DataContext="{Binding CmdData2}"
                      Header="{Binding}"/>
        </MenuItem>
    </Menu>
</StackPanel>

答案 1 :(得分:0)

我的解决方案是ItemTemplateSelector的实现。