我在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个问题(希望在一个帖子中允许):
提前致谢。
答案 0 :(得分:6)
没有必要参数化命令,因为绑定将执行所有操作,但如上所述,可以使用CommandParameter
。这里转换器将获得枚举参数。
一个例子:
<MenuItem Header="_Description" IsCheckable="True"
IsChecked="{Binding Path=DisplayMode_Current,
Converter={StaticResource EnumToBooleanConv},
ConverterParameter=Description}" />
<MenuItem Header="_Web-Page" IsCheckable="True"
IsChecked="{Binding Path=DisplayMode_Current,
Converter={StaticResource EnumToBooleanConv},
ConverterParameter=WebPage}" />
转换器看起来像这样:
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// You could also directly pass an enum value using {x:Static},
// then there is no need to parse
string parameterString = parameter as string;
if (parameterString == null)
return DependencyProperty.UnsetValue;
if (Enum.IsDefined(value.GetType(), value) == false)
return DependencyProperty.UnsetValue;
object parameterValue = Enum.Parse(value.GetType(), parameterString);
return parameterValue.Equals(value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string parameterString = parameter as string;
if (parameterString == null)
return DependencyProperty.UnsetValue;
return Enum.Parse(targetType, parameterString);
}
}
由于XAML仍然冗长(并且多余!),您可以通过将父ItemsSource
的{{1}}绑定到枚举值来进一步使用它,然后使用MenuItem
和ItemTemplate
。