如何创建具有更改控件的Header值的功能的RelayCommand?

问题描述 投票:0回答:1

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.
}

有人可以告诉我该怎么做才能解决此问题?

感谢阅读。

wpf command
1个回答
1
投票

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}" /> 
© www.soinside.com 2019 - 2024. All rights reserved.