RoutedUICommand具有更改控件的Header值的功能。
例如,下面的代码会将MenuItem的Header值更改为“ Cut”。
<MenuItem Command="ApplicationCommands.Cut"/>
但是如果使用RelayCommand代替“ ApplicationCommands.Cut”,则MenuItem的Header值不变。
public static class MenuActionCommands
{
public static MainWindow parentWindow { get; set; }
public static readonly RelayCommand NewProject = new RelayCommand(NewProjectExecute, NewProjectCanExecute);
}
<MenuItem Command="commands:MenuActionCommands.NewProject"/>
我的目标是将RelayCommand功能与更改UI标头值的RoutedUICommand功能结合在一起。
例如,我想在下面创建命令并使用它。
public class RelayUICommand : RelayCommand
{
// include functionality that changes control Header value.
}
有人可以告诉我该怎么做才能解决此问题?
感谢阅读。
MenuItem.Header
值是在MenuItem.Command
绑定到RoutedUICommand
且设置了RoutedUICommand.Text
属性时自动设置的。
因此您必须使用RoutedUICommand
并设置Text
属性。然后将调用委派给您的RelayCommand
实例:
public partial class MyUserControl : UserControl
{
public static RoutedUICommand NewProjectRoutedUICommand = new RoutedUICommand() { Text = "Create New Project" };
// Perhaps this command is exposed by a view model
public static RelayCommand NewProjectRelayCommand = new RelayCommand(NewProjectExecute, NewProjectCanExecute);
public MyUserControl()
{
this.CommandBindings.Add(new CommandBinding(NewProjectCommand, ExecutedNewProjectRoutedUICommand, CanExecuteNewProjectRoutedUICommand));
}
private void ExecutedNewProjectRoutedUICommand(object sender, ExecutedRoutedEventArgs e)
{
// Delegate to RelayCommand instance
MyUserControl.NewProjectRelayCommand.Execute(e.Parameter);
}
private bool CanExecuteNewProjectRoutedUICommand(object sender, CanExecuteRoutedEventArgs e)
{
// Delegate to RelayCommand instance
return MyUserControl.NewProjectRelayCommand.CanExecute(e.Parameter);
}
}
用法
<MenuItem Command="{x:Static MyUserControl.NewProjectRoutedUICommand" />
或者将Text
属性添加到RelayCommand
并将其绑定到MenuItem.Header
属性:
public class RelayUICommand : RelayCommand
{
public RelayUICommand(Action<object> executeDelegate, Func<object, bool> canExecuteDelegate, string description) : base(executeDelegate, canExecuteDelegate)
{
this.Text = description;
}
public RelayUICommand(Action<object> executeDelegate, Func<object, bool> canExecuteDelegate) => this(executeDelegate, canExecuteDelegate, string.Empty);
public string Text { get; set; }
}
用法
<MenuItem Command="{x:Static MenuActionCommands.NewProject}"
Header="{x:Static MenuActionCommands.NewProject.Text}" />
可重复使用的版本(将自动设置MenuItem.Header
)
<!-- Use in conjunction with the RelayUICommand -->
<Style TargetType="MenuItem">
<Setter Property="Header"
Value="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text} />
</Style>
<MenuItem Command="{x:Static MenuActionCommands.NewProject}" />