【发布时间】: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