【问题标题】:How to use event handling from the data context and not from code behind?如何从数据上下文而不是从后面的代码中使用事件处理?
【发布时间】:2016-11-30 05:14:28
【问题描述】:

我的 XAML 使用 DataContext,即 != self
所有属性都链接到该数据源。

我也想在 DataContext 中创建我的 "Click" 事件处理程序,而不是在后面的代码中。

我看到了一些我完全不熟悉的“命令”解决方案,但对于这种微小的需求来说,这些解决方案看起来相当复杂......

有什么简单的解决办法吗?

【问题讨论】:

  • 作为第一个选项,您可以使用命令另一种方法是,可以从视图事件处理程序调用视图模型中的公共方法

标签: c# wpf xaml event-handling datacontext


【解决方案1】:

最紧凑的解决方案是使用MarkupExtension 即时构造Command

<Button Command="{me:CallCommand MyMethod}" />
public class CallCommand : MarkupExtension, ICommand
{
    public string MethodName { get; set; }

    FrameworkElement element;

    public CallCommand() { }

    public CallCommand(string methodName) : this()
    {
        MethodName = methodName;
    }

    public event EventHandler CanExecuteChanged;

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

    public void Execute(object parameter)
    {
        if (MethodName == null) throw new InvalidOperationException($"{nameof(MethodName)} cannot be null.");

        var context = element.GetValue(FrameworkElement.DataContextProperty);
        context.GetType().GetMethod(MethodName).Invoke(context, null);
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));

        element = (FrameworkElement)target.TargetObject;

        return this;
    }
}

【讨论】:

  • 这是一个很好的解决方案。这里补充一点,调用方法应该是public,定义在ViewModel中。
  • 嗨,我们如何扩展这个类来处理 CanExecuteChanged 和处理来自 View 的参数。
  • @AbinMathew:您只需添加更多属性,获取参数或指向方法或事件(-以及更多构造函数参数,如果需要该简写-)并进行必要的反射以调用方法/订阅对于事件,它应该是相当简单的。唯一有问题的是进行绑定,这不能在标记扩展本身上完成,需要传入带有可绑定属性的DependencyObject,例如this.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多