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

时间:2016-10-11 13:03:43

标签: c# wpf mvvm

我有一个问题,我看了很多关于MVVM的教程,但我仍然感到困惑。 我有一个带有多个按钮的接口,我必须实现ICommand接口以将命令绑定到View。

我是这样做的:

MainSolution

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

好的,现在在界面中我有多个按钮,每个按钮都是分开的,例如,一个用于启动一个线程,另一个用于取消它而另一个用于另一个用途。 我应该为View上的每个按钮创建一个单独的类,实现ICommand接口吗?

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

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

我在网上搜索没有运气的例子......很多都是如此令人困惑,当然不适合像我这样的新手。

另一件事是当我有多个View和Multiple ViewModel时,我应该创建多个Commands Folder来嵌套吗?

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

2 个答案:

答案 0 :(得分:2)

对于经典MVVM方法中的每个命令,IMHO都有一个单独的类是一种矫枉过正。如果您想传递参数,请使用MVVMLight RelayCommand(以及generic one)。

然后,您可以将命令定义为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
}

您可以绑定到XAML中的MyCommand(假设您的View绑定到ViewModel):

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

答案 1 :(得分:1)

你想要的是一个DelegateCommand课程。你can use Prism,或只是谷歌并偷走一个; here's one on 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中,但不管出于何种原因。

相关问题