如何从数据上下文而不是从代码后面使用事件处理
本文关键字:事件处理 代码 数据 上下文 | 更新日期: 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;
}
}