我应该为界面中的每个按钮创建一个类吗?

本文关键字:一个 按钮 界面 我应该 创建 | 更新日期: 2023-09-27 18:12:25

我有一个问题,我看了很多关于MVVM的教程,但我仍然很困惑。我有一个界面上有多个按钮,我必须实现iccommand接口绑定命令到视图。

我是这样做的:

MainSolution

Main Solution
    Model
        SomeClass.cs
    ViewModel
        Commands
            SomeCommands.cs
        SomeViewModel.cs

Ok,现在在界面中我有多个按钮,每个按钮做单独的事情,例如,一个是启动一个线程,另一个是取消它,第三个是另一个事情。我应该创建一个单独的类,实现iccommand接口,为我在视图上的每个按钮?

Main Solution
    Model
        SomeClass.cs
    ViewModel
        Commands
            StartCommands.cs
            CancelCommands.cs
            OtherCommands.cs
        SomeViewModel.cs

我问这个,因为当我实现iccommand接口时,我只有一个"执行"方法,只有一个"CanExecute"方法。通过绑定在视图上实现多个按钮的常见方法是什么?

我在网上搜索的例子没有任何运气…其中很多都很令人困惑,对于像我这样的新手来说肯定不是。

另一件事是当我有多个视图和多个视图模型,我应该创建多个命令文件夹嵌套吗?

Main Solution
    Model
        SomeClass.cs
    ViewModel
        FirstCommands
            StartCommands.cs
            CancelCommands.cs
            OtherCommands.cs
        SecondCommands
            StartCommands.cs
            CancelCommands.cs
            OtherCommands.cs
        FirstViewModel.cs
        SecondViewModel.cs

我应该为界面中的每个按钮创建一个类吗?

在经典的MVVM方法中为每个命令提供一个单独的类是多余的。使用MVVMLight的RelayCommand(如果你想传递一个参数,可以使用通用的RelayCommand)。

然后你可以定义你的命令作为你的ViewModel成员,并提供Execute/CanExecute实现作为你的ViewModel的一部分,以及:

public RelayCommand MyCommand { get; }
public MyView()
{
    //[...]
    this.MyCommand = new RelayCommand(this.ExecuteMyCommand, this.CanExecuteMyCommand);
}
public void ExecuteMyCommand()
{
   //do work!
}
public bool CanExecuteMyCommand()
{
   //optional - control if command can be executed at a given time
}

你可以绑定到MyCommand在XAML(假设你的视图绑定到你的ViewModel):

<Button Content='WORK!' Command='{Binding MyCommand}' />

您需要的是DelegateCommand类。你可以使用Prism,也可以在谷歌上随便找一个;这是StackOverflow上的一个,我没有测试过,但看起来是合法的。如果命令不需要参数,只需忽略parameter参数即可。

DelegateCommand实现ICommand,并调用传递给其构造函数的ActionAction<object>,如下所示(来自上面链接的StackOverflow答案):

public DelegateCommand AddFolderCommand { get; protected set; }
public MyViewModel(ExplorerViewModel explorer)
{           
    AddFolderCommand = new DelegateCommand(ExecuteAddFolderCommand, (x) => true);
}
public void ExecuteAddFolderCommand(object param)
{          
    MessageBox.Show("this will be executed on button click later");
}

这应该包含在WPF中,但由于某种原因没有包含。