如何从数据上下文而不是从代码后面使用事件处理

本文关键字:事件处理 代码 数据 上下文 | 更新日期: 2023-09-27 17:58:44

我的XAML使用DataContext,它是!=self
所有属性都链接到该DataSource。

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

我看到了一些我根本不熟悉的"命令"解决方案,但对于这个微小的需求来说,这些解决方案看起来相当复杂。。。

有什么简单的解决方案吗?

如何从数据上下文而不是从代码后面使用事件处理

最紧凑的解决方案是使用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;
    }
}