为相同模型但为不同控件指定数据模板
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。
例如我们有:
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。