为相同模型但为不同控件指定数据模板

Specify datatemplate for same model but for different controls

例如我们有:

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) 并希望在工具栏和菜单中使用它们。

在 Menu 中,CheckableCmdData 是一个带有 IsCheckable="True" 的 MenuItem。在工具栏中它是一个复选框。

我有一个菜单数据模板。
为相同模型但为不同控件创建 DataTemplate 的适当方法是什么,还是我应该改用样式?

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

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

我的解决方案是实现 ItemTemplateSelector。