【发布时间】:2012-02-18 00:40:56
【问题描述】:
我在 XAML 中定义了 3 个菜单项(使用 WPF-MDI):
<MenuItem Header="_Generic" Name="Generic" ToolTip="Generic Visual Studio designer theme"
Command="{Binding Path=SelectGenericTheme}"/>
<MenuItem Header="_Luna" Name="Luna" ToolTip="Blue Windows XP theme"
Command="{Binding Path=SelectLunaTheme}"/>
<MenuItem Header="_Aero" Name="Aero" ToolTip="Windows Vista/7 theme"
Command="{Binding Path=SelectAeroTheme}"/>
以及 ViewModel 中命令和当前选择的定义:
public enum ESelectedTheme
{
Generic,
Luna,
Aero
}
ESelectedTheme _selectedTheme;
ICommand _selectGenericThemeCommand;
public ICommand SelectGenericThemeCommand
{
get { return _selectGenericThemeCommand ?? (_selectGenericThemeCommand = new RelayCommand(param => SelectGenericTheme(),
param => true)); }
}
void SelectGenericTheme()
{
_selectedTheme = ESelectedTheme.Generic;
}
ICommand _selectLunaThemeCommand;
public ICommand SelectLunaThemeCommand
{
get
{
return _selectLunaThemeCommand ?? (_selectLunaThemeCommand = new RelayCommand(param => SelectLunaTheme(),
param => true));
}
}
void SelectLunaTheme()
{
_selectedTheme = ESelectedTheme.Luna;
}
ICommand _selectAeroThemeCommand;
public ICommand SelectAeroThemeCommand
{
get
{
return _selectAeroThemeCommand ?? (_selectAeroThemeCommand = new RelayCommand(param => SelectAeroTheme(),
param => true));
}
}
void SelectAeroTheme()
{
_selectedTheme = ESelectedTheme.Aero;
}
我有 2 个问题(希望在一篇帖子中允许):
- 我想将 XAML 中的 IsChecked 属性绑定到选定的值 (_selectedTheme)。我想我需要写一个转换器,但我不知道怎么做。
- 我制作了 3 个 ICommand 副本(每个主题一个)...如果我有 20 个主题会怎样...有没有办法让这段代码参数化?
提前致谢。
【问题讨论】:
-
你可以指定一个
CommandParameter,你问如何参数化一个命令?您是否一直忽略param => ...却不知道如何使用它? -
使用参数化我的意思是只使用 1 个命令而不是 3 个命令(但我会检查 CommandParameter 的工作原理,也许这会有所帮助)。感谢您的评论。
-
对于
RelayCommand(T),将“true”作为谓词传递是没有意义的,因为它一开始就是默认的。 -
@m-y: 取决于实现...
-
@H.B.我想可能有一个博客发布了
RelayCommand(T)的一个版本,其中只有一个构造函数接受两个参数,但谷歌搜索结果都只允许传入Action(T)。
标签: wpf xaml command menuitem ischecked