WPF MVVM绑定数据上下文的最佳实践



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

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

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

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

主机(系统1):

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

Plugin (System 1):

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

ViewModel (System 1):

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

主机(系统2):

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

插件(System 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 (System 2):

public ViewModel()
{
    //Initialisation code
}

Thanks in advance

关于您的事件处理实现:

简写:

  • 你不应该在你的后台代码中将事件绑定到VM,甚至在后台代码中使用你的VM:表示和业务代码会混合,如果你的视图改变,你可能会破坏你的代码逻辑
  • 你永远不应该在视图模型中使用视图或其控件:VM是用于业务的地方,而不是用于表示

我总是记得这一次,特别是当我不得不完全重新组织一个大的复杂视图(重命名控件,从列表框切换到网格视图,重组网格,等等):因为我的MVVM是干净的(VM/业务从视图/表示严格分离),我能够做到这一点,而不触及任何行从我的业务逻辑。如果我将所有控件事件直接绑定到视图模型,这将是一场噩梦。

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

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

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

相关内容

  • 没有找到相关文章

最新更新