2016-07-26 17 views
0

我的XAML使用DataContext这是!= self
所有属性都链接到该数据源。如何使用数据上下文中的事件处理而不是来自后面的代码?

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

我看到一些“命令”解决方案,我不熟悉的一切,但这些寻找那些微小的需求相当复杂......

是否有任何简单的解决方案?

+0

作为第一个选项,你可以使用这些命令的另一种方式也将是,在视图模型公开的方法可以从视图的事件处理程序 – Ugur

回答

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; 
    } 
} 
+0

被称为这是一个很好的解决方案。在这里添加一点,Calling方法应该是'public'并且在'ViewModel'中定义。 –

+0

嗨,我们如何扩展这个类来处理CanExecuteChanged并处理来自View的参数。 –

+1

@AbinMathew:你只需要添加更多的属性,参数或指向方法或事件( - 和更多的构造函数参数,如果需要速记 - ),并做必要的反射来调用方法/订阅事件,它应该是非常坦率的。唯一有问题的是做绑定,这不能在标记扩展本身上完成,需要传递一个具有可绑定属性的“DependencyObject”,参见例如[本](http://stackoverflow.com/questions/6461826/in-wpf-can-you-filter-a-collectionviewsource-without-code-behind/6462282#6462282)。 –

相关问题