【问题标题】:WPF - Handling events from user control in View ModelWPF - 在视图模型中处理来自用户控件的事件
【发布时间】:2011-02-25 00:14:48
【问题描述】:

我正在使用 MVVM 模式构建一个 WPF 应用程序(这两种技术对我来说都是新技术)。我使用用户控件来实现不包含业务逻辑的简单可重用功能,并使用 MVVM 模式来构建应用程序逻辑。假设一个视图包含我的触发事件的用户控件,并且我想为该事件添加一个事件处理程序。该事件处理程序应该在视图的视图模型中,因为它包含业务逻辑。问题是——视图和视图模型只能通过绑定来连接;如何使用绑定连接事件处理程序?甚至有可能(我怀疑不是)?如果不是——我应该如何处理来自视图模型中控件的事件?也许我应该使用命令或 INotifyPropertyChanged?

【问题讨论】:

    标签: wpf events mvvm


    【解决方案1】:

    一般来说,避免代码中的代码是一个很好的 MVVM 实践,如果您在用户控件中使用事件就是这种情况。因此,如果可能,请使用INotifyPropertyChangedICommand

    话虽如此,根据您的项目和您的务实程度,有时在后面使用控件的代码会更有意义。

    我曾在一些场合使用过这样的东西:

    private void textBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        MyViewModel vm = this.DataContext as MyViewModel;
        vm.MethodToExecute(...);
    }
    

    您也可以考虑Attached Command Behaviour,有关此内容和实现的更多信息可在此处找到:

    Firing a double click event from a WPF ListView item using MVVM

    【讨论】:

    • 控件应该是可重用的,所以代码不会这样做 - 它将控件与特定的视图模型联系起来。命令......可能不是 - 它们更多用于用户操作。 INotifyPropertyChanged 那么呢?谢谢:)
    • 在不知道更多细节的情况下很难对我说。但我添加了一些相关信息的链接
    • @Vitaly 如果您担心将 View 绑定到显式 ViewModel,您可以将 ViewModel 包装在一个界面中。我会研究它们正在成为公认的做法的附加命令行为。另外,请查看 MVVMLight 或 Caliburn 作为框架来协助您的 MVVM 工作,它会让您的生活更轻松。
    • 抱歉,Necro-Threading 但我一直在尝试让我的事件在我的控制器中处理一段时间,在我调用函数的那一行,我从中得到“System.NullReferenceException”我假设 DataContext 是空的并且正在尝试构建我的控制器?
    • ((TypeOfControl)sender).DataContext 是否可以用于单个控件,同时也可以避免DataContext 不在窗口中的情况?
    猜你喜欢
    • 2012-06-27
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多