【问题标题】:WPF MVVM binding datacontext best practiceWPF MVVM 绑定数据上下文最佳实践
【发布时间】:2015-12-14 05:14:39
【问题描述】:

有人告诉我,MVVM 的最佳实践是将视图模型传递给视图,因此它在运行前不知道数据上下文。 (系统一)

但是,我发现的每篇文章都将视图模型传递到 xaml 数据上下文中,这对于 MVVM 来说似乎并不理想。 (系统2)

在 WPF MVVM 中绑定数据上下文的最佳方法是什么?这对事件处理程序绑定有何影响?

示例: 我有一个组合框链接到我的 ViewModel 中的一个项目。当我使用绑定系统 2 时,组合框选择会触发“ComboChanged”事件。使用绑定系统 1 时,组合框选择会更改,但不会触发事件。整个页面加载完成后,手动更改组合框时将触发该事件。

主机(系统 1):

public override void Initialise()
{
    element = new Plugin(new ViewModel(Credentials));
    element.combobox.SelectedIndex = 0;
}

插件(系统 1):

public Plugin(ViewModel viewModel)
{
     InitializeComponent();
     ViewModel = viewModel;
     this.DataContext = ViewModel;
     ViewModel.ComboChanged += new EventHandler<ComboChangedEventArgs>(performComboChanged);
}

ViewModel(系统 1):

public ViewModel(Credentials credentials)
{
    //Initialisation code
}

主机(系统 2):

public override void Initialise()
{
     element = new Plugin(Credentials)
     element.combobox.SelectedIndex = 0;
}

插件(系统 2):

public Plugin(Credentials credentials)
{
    InitializeComponent();
    ViewModel = ((ViewModel)this.DataContext);
    ViewModel.Credentials = credentials;
    ViewModel.ComboChanged += new EventHandler<ComboChangedEventArgs>(performComboChanged);
}

//Plugin.xaml
<UserControl.DataContext>
    <local:ViewModel/>
</UserControl.DataContext>

ViewModel(系统 2):

public ViewModel()
{
    //Initialisation code
}

提前致谢

【问题讨论】:

  • 系统 1 在您的视图模型/服务的生命周期中提供了更大的灵活性。例如,使用 IOC 模式和框架会更容易。相反,我认为系统 2 每次实例化视图时都会创建视图模型的新实例。但是,从正确的 MVVM 方法的角度来看,处理组合框事件的方式非常糟糕;)
  • 哦!谢谢你。你能告诉我我应该如何更好地处理它吗?我非常想让系统 1 以一种很好的 MVVM 方式与组合框一起工作。
  • 在下面查看我关于 MVVM 上下文中事件处理的完整答案

标签: wpf mvvm binding viewmodel datacontext


【解决方案1】:

关于你的事件处理实现:

简而言之:

  • 您不应该在您的代码中将事件绑定到虚拟机,甚至在您的代码中使用您的虚拟机:演示和业务代码会混合在一起,如果您的视图发生更改,您可能会破坏您的代码逻辑
  • 您永远不应该在您的视图模型中使用您的视图或其控件之一:VM 是用于业务的地方,而不是用于演示的地方

我始终牢记这一点,特别是当我必须完全重新组织一个大型复杂视图(重命名控件、从列表框切换到网格视图、重新组织网格等)时:因为我的 MVVM 是干净的(严格分离VM/business from view/presentation)我能够做到这一点,而无需触及我的业务逻辑中的任何线路。如果我将所有控制事件直接绑定到我的视图模型,这将是一场噩梦。

从这里你有(至少)两个选择:

  1. 使用可让您将控件事件绑定到视图模型命令或方法的交互库
  2. 创建您自己的行为,以实现控件事件和视图模型命令或属性之间的这种链接。

这篇文章总结了交互选项:MVVM events

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多