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

Is it possible to disable data binding for a control until it has the correct DataContext?

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

也就是说,加载模块时,详细视图会加载到 MainWindowView 中的区域,并在导航期间设置其真实视图模型之前尝试绑定到 MainWindowViewModel。我想首先防止这种错误的绑定,并且仅在已为详细视图分配正确的视图模型时才进行绑定。这可能吗?如何实现?

如果做不到这一点,我是否可以只在模块初始化后向区域注册视图,仅当我需要导航到该详细视图时?

一种可能对您有用且在 Prism 中很典型的技术是 视图注入。您可以找到更多相关信息 here。这与 view discovery 不同,后者是您在模块加载期间预先注册所有内容的地方。

视图注入的前提是你根据发生的事情通过代码将视图分配给一个区域。因此,与其在模块初始化期间使用 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 中的模块是可选的。但是,它们确实提供了一种机制,可以让您预先完成所有这些绑定。 但是,我能理解有时需要更多的控制。