2009-12-18 39 views
9

想知道人们对如何以最轻量的方式尽可能好地处理ViewModel中的事件的想法提供了想法。MVVM中的简单事件处理

例子:

<MediaElement 
    MediaOpened={Binding SomeEventHandler} /> 

在这种情况下,我们要处理的视图模型的MediaOpened事件。没有像Prism这样的框架,如何将其绑定到ViewModel?

回答

12

Commanding - 你的“SomeEventHandler”必须实现ICommand一类...有可用的网络文学一堆...

而且 - 我会考虑让一个免费的,轻量级的“迷你” MVVM框架如MvvmFoundation,它提供了RelayCommand为这样一个目的(而无需学习PRISM的复杂性/开销)

编辑:

看一看this b记录附加命令到任何事件...正如我所提到的那样,它是非常强大的,但我想你需要做出判断呼叫,如果这是你想要的,相比于附加一个老式事件,并使用在后面,你的代码超薄的机身事件处理程序只是调用了一些方法,在你的视图模型,是这样的:

public void SomeEventHandler(object sender, SomeEventArgs e) 
{ 
    MyViewModel vm = (MyViewModel)this.DataContext; 
    vm.HandleLoadEvent(); 
} 

务实VS最佳实践......我跟你走的。)

+0

我没想到我能在这种情况下的使用一个ICommand ...感谢您的信息...这是一个有点重复问题,然后。 – 2009-12-18 04:00:57

+0

好吧...我只是尝试使用ICommand,我使用MVVMFoundation,所以它是一个RelayCommand类型。但是,我得到一个构建错误“绑定路径= MediaOpenedCommand,模式=一次性”'不是一个有效的事件处理程序方法名称...“我只是把它设置错了? – 2009-12-18 04:06:42

+0

对不起,是的...您需要将RelayCommand实例绑定到Command,并通过CommandBindings或InputBindings将其绑定到UI ...我强烈建议你稍微阅读一下 - 从事件到命令的切换是人们对WPF持续关注的那些“陡峭的学习曲线”之一 - 但是当你饶有兴趣的时候它就非常强大! – kiwipom 2009-12-18 04:12:22

0

MediaOpened是一个事件,不支持命令绑定。

为了绑定到事件,可以使用辅助对象,该对象附着到事件并执行命令。

要绑定到视图模型,请添加一个实现ICommand的属性。本MSDN杂志文章中的图3显示了RelayCommand,它是ICommand的有用实现。 RelayCommand使用委托进行初始化,以连接到您的视图模型。

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

+0

我得到命令绑定问题,我已阅读Josh Smith关于MVVM的文章,但是我遇到问题的部分是 “要绑定到事件,可能会使用一个辅助对象附加到事件并执行命令“。 通过助手对象你是否像一个附加行为? – 2009-12-18 05:20:34

+0

是的,行为是进行绑定的好方法。 IanR提供的链接看起来不错。 – 2009-12-18 13:01:31

0

小和开源ImpromptuInterface.MVVM框架公顷event binding syntax并在.NET 4.0中使用DLR。虽然这个例子需要继承ImpromptuViewModel。 event binding property对该特定视图模型类型没有任何依赖性,并且所涉及的是公开的。

<Window x:Class="MyProject.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:MVVM="clr-namespace:ImpromptuInterface.MVVM;assembly=ImpromptuInterface.MVVM" Title="MainWindow" Height="600" Width="800"> 

    <MediaElement MVVM:Event.Bind="{Binding Events.MediaOpened.To[MediaElement_MediaOpened]}" /> 

...

public class MyViewModel{ 

    public dynamic Events 
    { 
     get { return new EventBinder(this); } 
    } 

    public void MediaElement_MediaOpened(MediaElement sender, RoutedEventArgs e){ 
     ... 
    } 
} 
相关问题