内置于ICommand接口和命令设计模式的C#WPF

时间:2019-03-11 19:19:43

标签: c# wpf design-patterns command icommand

我一般都不熟悉WPF和c#。我正在阅读有关命令设计模式的信息,并期待在我的新应用程序中实现它,以便它可以执行和撤消功能。然后我意识到WPF已经带有ICommand接口,并且de xml按钮可以实现它。表示接口有以下方法:

public bool CanExecute(object parameter)
{
}

private void OnCanExecuteChanged()
{
}

public void Execute(object parameter)
{
}

那么,我应该通过让其他接口继承它并添加undo方法,来向已经在ICommand Interface中构建的此功能添加撤消功能吗?

此界面仅用于按钮吗?我的意思是,我想创建许多其他未必连接到xnml按钮的命令

提前谢谢!

3 个答案:

答案 0 :(得分:1)

首先,这些命令是MVVM模式的一部分,您应该首先了解它。

C#中的接口不提供任何功能,它们仅描述了继承此接口的类应如何工作。如果您希望类做某事,则不应将这些方法留空。

WPF中的命令代表一种框架,以后将向其传输逻辑。命令最合乎逻辑的用法是将它们绑定到按钮。

ICommand实现示例:

public class RelayCommand : ICommand
{
    private readonly Action<object>     execute;
    private readonly Func<object, bool> canExecute;

    public event EventHandler CanExecuteChanged {
        add => CommandManager.RequerySuggested    += value;
        remove => CommandManager.RequerySuggested -= value;
    }

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        this.execute    = execute;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return canExecute == null || canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        execute(parameter);
    }
}

使用示例的命令:

 public static RelayCommand NavigateToSignInPage => new RelayCommand(
        actionParameter => Application.Instance.Navigation.NavigateTo(new LoginForm()));

    public static RelayCommand NavigateToSignUpPage => new RelayCommand(
        actionParameter => Application.Instance.Navigation.NavigateTo(new RegistrationForm()));

    public static RelayCommand NavigateToStartPage => new RelayCommand(
        actionParameter => Application.Instance.Navigation.NavigateTo(new StartPage()));

    public static RelayCommand NavigateBack => new RelayCommand(
        actionParameter => Application.Instance.Navigation.NavigateBack(),
        actionPossibilityParameter => Application.Instance.Navigation.BackNavigationPossible);

命令绑定示例: 可见(xaml):

<Button x:Name="CancelButton"
            Content="Cancel"
            Command="{Binding CancelCommand}"
            Grid.Row="2"
            IsCancel="True"
            HorizontalAlignment="Left"
            Margin="44,0,0,0"
            Width="118" Height="23"
            VerticalAlignment="Center" />

在ViewModel中:

        public RelayCommand CancelCommand => NavigationCommands.NavigateBack;

答案 1 :(得分:0)

  1. CanExecute将引导您确定是否执行Command,对于Command实施,您可以看到here
  2. 您将Commodand绑定到Button是绑定到单击而不是Button控件。因此,所有“命令”绑定,不仅限于单击,还可以进行检查,放下,聚焦等操作

答案 2 :(得分:0)

我认为您在这里混淆其他事情。 ICommand Interface是用于将UI事件绑定到诸如MVVM之类的设计模式中使用的代码的东西。您尝试实现的Command Design Patternundoing actions的状态架构,就像按下按钮一样。