有什么方法可以避免实现ICommand以便在MVVM中使用Button?

时间:2018-11-17 09:46:09

标签: c# wpf mvvm

我正在开发一个非常简单的应用程序,一个带有几个按钮的视图。我想可以在视图模型中使用按钮的click事件。

但是我仅找到需要使用blend中的Interactivity.dll的示例,或者我必须实现ICommand接口或其他解决方案。

我想知道现在是否有任何解决方案不需要实现ICommand或使用诸如MVVM Light之类的框架。我想使用最简单的解决方案。

谢谢。

3 个答案:

答案 0 :(得分:0)

为什么要避免使用ICommand?

您可以编写自己的ICommand实现,但是当MVVM Light具有所有工具且易于使用时,则不需要此操作。

如果您的应用是如此简单,则您可以选择:

  1. 忽略MVVM模式,仅在后面的代码中实现事件处理程序

  2. (我建议)将MVVM Light与默认的ICommand实现一起使用

    public RelayCommand ExampleRelayCommand =>新的RelayCommand(ExampleMethod);

    private void ExampleMethod()
    {
    
    }
    
  3. 如果需要EventArgs,则可以使用PassEventArgsToCommand =“ True”以及MVVM Light来实现交互触发器和EventToCommand

        public RelayCommand<RoutedEventArgs> EventRelayCommand => new RelayCommand<RoutedEventArgs>(EventRelayCommandMethod);
    
    private void EventRelayCommandMethod(RoutedEventArgs e)
    {
    
    }
    

然后,在XAML中的按钮内:

<Button Grid.Column="0" Content="Example"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <command:EventToCommand Command="{Binding EventRelayCommand}" PassEventArgsToCommand="True" /> </i:EventTrigger> </i:Interaction.Triggers> </Button>

答案 1 :(得分:0)

您为什么不喜欢使用ICommand?如果您要遵循MVVM模式,那么这是在UI和业务逻辑层之间实现分离的完美方法。

ICommand的最基本实现就是这样

/// <summary>
/// a very simple ICommand implementation
/// </summary>
public class BasicCommand: ICommand
{
    private readonly Action _execute;

    public BasicCommand(Action execute)
    {
        _execute = execute;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        _execute?.Invoke();
    }

    public event EventHandler CanExecuteChanged;
}

ICommand的更高级实现(例如MVVM-Light RelayCommand)还需要通过CanExecute机制来禁用任何绑定控件(例如按钮或菜单项),而这种耦合的方式更加分离和清洁而不是尝试设置Button.InEnabled。

答案 2 :(得分:0)

您可能想看看Caliburn.Micro。这是一个MVVM库,可让您定义视图模型中没有任何命令的方法,并使用命名约定将它们绑定到它们:

查看模型:

public void Click() { /* handle */ }

查看:

<Button Content="Click!" x:Name="Click" />

另一种选择是将click事件处理程序添加到视图的代码隐藏类中,然后从那里调用视图模型的方法:

private void Button_Click(object sender, RoutedEventArgs e) 
    => (DataContext as GeneralOptionsViewModel).Click();

然后,您不使用任何命令,但仍将应用程序逻辑保留在视图模型中。