代码之家  ›  专栏  ›  技术社区  ›  Álvaro García

有什么方法可以避免实现ICommand来使用MVVM中的按钮吗?

  •  0
  • Álvaro García  · 技术社区  · 7 年前

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

    我想知道现在是否有解决方案不需要实现ICommand或使用mvvmlight这样的框架。我想用最简单的解决办法。

    谢谢。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Peregrine    7 年前

    你为什么这么讨厌使用 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;
    }
    

    I命令 MVVM-Light RelayCommand 您还可以根据需要通过CanExecute机制禁用任何绑定控件(例如按钮或菜单项),这比尝试设置button.ineEnabled更解耦、更干净。

        2
  •  1
  •   DGrowns    7 年前

    你为什么要避开ICommand?

    您可以编写自己的ICommand实现,但当mvvmlight拥有所有工具且易于使用时,这是不必要的。

    1. 忽略MVVM模式,只在代码隐藏中实现事件处理程序

    2. (我建议)使用mvvmlight和默认的ICommand实现

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

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

    <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>

        3
  •  1
  •   mm8    7 年前

    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();
    

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