我应该为界面中的每个按钮创建一个类吗?
本文关键字:一个 按钮 界面 我应该 创建 | 更新日期: 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
,并调用传递给其构造函数的Action
或Action<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中,但由于某种原因没有包含。