Mic*_*ers 4 wpf xaml command menuitem ischecked
我在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}"/>
Run Code Online (Sandbox Code Playgroud)
以及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;
}
Run Code Online (Sandbox Code Playgroud)
我有2个问题(希望在一个帖子中允许):
提前致谢.
没有必要参数化命令,因为绑定将执行所有操作,但如上所述,可以使用CommandParameter.这里转换器将获得enum参数.
一个例子:
<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}" />
Run Code Online (Sandbox Code Playgroud)
转换器看起来像这样:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
由于XAML仍然冗长(并且多余!),您可以通过ItemsSource将父级绑定MenuItem到枚举值来进一步使用它,然后使用ItemTemplate和ItemContainerStyle.
| 归档时间: |
|
| 查看次数: |
5151 次 |
| 最近记录: |