我的XAML使用DataContext
这是!= self。
所有属性都链接到该数据源。如何使用数据上下文中的事件处理而不是来自后面的代码?
我想在DataContext中创建我的"Click"
事件处理程序,而不是在后面的代码中。
我看到一些“命令”解决方案,我不熟悉的一切,但这些寻找那些微小的需求相当复杂......
是否有任何简单的解决方案?
我的XAML使用DataContext
这是!= self。
所有属性都链接到该数据源。如何使用数据上下文中的事件处理而不是来自后面的代码?
我想在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;
}
}
被称为这是一个很好的解决方案。在这里添加一点,Calling方法应该是'public'并且在'ViewModel'中定义。 –
嗨,我们如何扩展这个类来处理CanExecuteChanged并处理来自View的参数。 –
@AbinMathew:你只需要添加更多的属性,参数或指向方法或事件( - 和更多的构造函数参数,如果需要速记 - ),并做必要的反射来调用方法/订阅事件,它应该是非常坦率的。唯一有问题的是做绑定,这不能在标记扩展本身上完成,需要传递一个具有可绑定属性的“DependencyObject”,参见例如[本](http://stackoverflow.com/questions/6461826/in-wpf-can-you-filter-a-collectionviewsource-without-code-behind/6462282#6462282)。 –
作为第一个选项,你可以使用这些命令的另一种方式也将是,在视图模型公开的方法可以从视图的事件处理程序 – Ugur