将自定义方法与ViewModel中的参数绑定

时间:2018-10-29 13:05:22

标签: c# mvvm parameters uwp routed-events

我正在创建UWP MVVM应用程序。我已经创建了ViewModel和View,并使其成为DataContext,并且绑定工作一切正常。

我能够调用没有参数的方法。这是我在View中的XAML代码:

<Button VerticalAlignment="Top" HorizontalAlignment="Right" Margin="50" Width="50" Height="50" Background="Transparent" BorderBrush="Transparent" Content="OK" FontSize="32" FontWeight="Bold" Foreground="White" Click="{x:Bind Path=ViewModel.ButtonMainClick, Mode=OneWay}"/> 

在ViewModel中,我这样子:

public void ButtonMainClick()
{
    // TO DO
}

这很好用。

现在,我想调用一些具有参数的方法。但是我无法做到这一点。我在互联网上看到有一个EventTriggerBehavior。但是我不确定如何使用它并传递一些参数。

有什么主意吗?

2 个答案:

答案 0 :(得分:0)

假设UWP和WPF绑定的工作原理相同,则应将按钮绑定到ICommand中类型为ViewModel的属性。 ICommand的常见实现是RelayCommand,它看起来像这样:

 public class RelayCommand : ICommand
    {
        private readonly Action _targetExecuteMethod;
        private readonly Func<bool> _targetCanExecuteMethod;
        public RelayCommand(Action executeMethod) => _targetExecuteMethod = executeMethod;

        public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod)
        {
            _targetExecuteMethod = executeMethod;
            _targetCanExecuteMethod = canExecuteMethod;
        }
        public void RaiseCanExecuteChanged() => CanExecuteChanged(this, EventArgs.Empty);
        bool ICommand.CanExecute(object parameter) => _targetCanExecuteMethod?.Invoke() ?? _targetExecuteMethod != null;
        public event EventHandler CanExecuteChanged = delegate { };
        void ICommand.Execute(object parameter) => _targetExecuteMethod?.Invoke();
    }
    public class RelayCommand<T> : ICommand
    {
        private readonly Action<T> _targetExecuteMethod;
        private readonly Func<T, bool> _targetCanExecuteMethod;
        public RelayCommand(Action<T> executeMethod) => _targetExecuteMethod = executeMethod;
        public RelayCommand(Action<T> executeMethod, Func<T, bool> canExecuteMethod)
        {
            _targetExecuteMethod = executeMethod;
            _targetCanExecuteMethod = canExecuteMethod;
        }
        public void RaiseCanExecuteChanged() => CanExecuteChanged(this, EventArgs.Empty);
        bool ICommand.CanExecute(object parameter)
        {
            if (_targetCanExecuteMethod != null)
            {
                var tparm = (T)parameter;
                return _targetCanExecuteMethod(tparm);
            }
            return _targetExecuteMethod != null;
        }
        public event EventHandler CanExecuteChanged = delegate { };
        void ICommand.Execute(object parameter) => _targetExecuteMethod?.Invoke((T)parameter);
    }

对于View和ViewModel,请看以下示例:https://stackoverflow.com/a/53045098/9889260

如果要使用参数。您只需使用通用的RelayCommand<T>,其中T是您要作为参数传递的类型,还可以使用ExcecuteCanExcecute(如果有)方法{{ 1}}作为参数。

亲切的问候, 错误

答案 1 :(得分:0)

使用x:Bind的事件处理程序不能接受任意参数。

一个简单的解决方案是公开另一个为您调用的方法。绑定到Click事件的方法没有参数,但仅调用您需要执行的方法。

[编辑]如果需要从生成事件的控件中传递上下文,则可以通过添加事件签名并访问sender的{​​{1}}并强制转换ViewModel类型来实现。

DataContext