是否可以禁用控件的数据绑定,直到它具有正确的DataContext?

时间:2017-02-04 02:49:02

标签: c# wpf data-binding prism prism-6

我有一个包含DetailViewModel个对象列表的选择视图。选择其中一个时,使用Prism视图切换导航将其传递到详细视图(从UserControl派生)。因为在加载模块时加载了详细视图,所以它会在导航到之前尝试绑定到环境数据上下文。

也就是说,在加载模块时,详细信息视图将加载到MainWindowView中的某个区域,并尝试在导航期间设置其真实视图模型之前绑定到MainWindowViewModel。我想防止这个第一个错误的绑定,并且仅在为详细视图分配了它的正确视图模型时才绑定。这有可能,怎么样?

如果失败了,我是否可能只在模块初始化后才能在区域中注册视图,只有在我需要导航到该详细视图时?

1 个答案:

答案 0 :(得分:1)

一种可能对您有用的技术,以及Prism中常见的技术,是 view injection 。您可以找到有关它的更多信息here。这与视图发现不同,后者在模块加载期间预先注册所有内容。

视图注入的前提是您可以根据发生的事情通过代码为区域分配视图。因此,不是在模块初始化期间使用RegisterViewWithRegion,而是在控制器中执行类似下面的操作,或者在任何地方执行此操作。

//IRegionManager regionManager = <get this via ctor injection, or resolve this from the contain>;
IRegion contentRegion = regionManager.Regions["ContentRegion"];
InterestingView view = this.container.Resolve<InterestingView>();
// Set view.DataContext here, maybe...
// either via the container, or newing something up
mainRegion.Add(view);
mainRegion.Activate(view); // shows the view

我没有尝试过,但我没有看到为什么在将视图添加到区域之前无法在视图上设置DataContext的原因。但是,如果你使用Prism附带的ViewModelLocator,你可能不必担心它。

您可以在Prism GitHub上找到完整的视图注入示例here

您可能知道Prism中的模块是可选的。但是,它们确实提供了一种机制,可以让您在前面完成所有这些绑定。 但是,我可以理解有时需要多一点控制。