Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在控件具有正确的DataContext之前,是否可以禁用该控件的数据绑定?_C#_Wpf_Data Binding_Prism_Prism 6 - Fatal编程技术网

C# 在控件具有正确的DataContext之前,是否可以禁用该控件的数据绑定?

C# 在控件具有正确的DataContext之前,是否可以禁用该控件的数据绑定?,c#,wpf,data-binding,prism,prism-6,C#,Wpf,Data Binding,Prism,Prism 6,我有一个带有DetailViewModel对象列表的选择视图。选择其中一个后,它将通过Prism视图切换导航传递到从UserControl派生的详细视图。由于详细信息视图是在加载模块时加载的,因此在导航到该模块之前,它会尝试绑定到环境数据上下文 也就是说,加载模块时,详细视图将加载到MainWindowView中的区域中,并在导航期间设置其真实viewmodel之前尝试绑定到MainWindowViewModel。我想防止这种第一次的错误绑定,并且仅在为详图视图指定了正确的viewmodel时才

我有一个带有DetailViewModel对象列表的选择视图。选择其中一个后,它将通过Prism视图切换导航传递到从UserControl派生的详细视图。由于详细信息视图是在加载模块时加载的,因此在导航到该模块之前,它会尝试绑定到环境数据上下文

也就是说,加载模块时,详细视图将加载到MainWindowView中的区域中,并在导航期间设置其真实viewmodel之前尝试绑定到MainWindowViewModel。我想防止这种第一次的错误绑定,并且仅在为详图视图指定了正确的viewmodel时才进行绑定。这有可能吗?怎么可能


否则,我可能只能在模块初始化后,仅当我需要导航到该详细视图时,才将视图注册到该区域?

一种可能适用于您的技术,也是Prism中的典型技术,即视图注入。你可以找到更多关于它的信息。这与视图发现不同,视图发现是在模块加载期间预先注册所有内容

视图注入的前提是,根据发生的事情,通过代码将视图指定给区域。因此,与在模块初始化期间使用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上找到视图注入的完整示例


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

这正是我自第一次发帖以来一直在思考的问题。我也不希望我的细节区域塞满了未使用的视图,即使按需加载模块,仍然没有卸载。我只是还不太清楚该怎么做。我没有使用ViewModelLocator,因为我在选择视图中已经有了viewmodel,并将其作为导航参数传递给详细视图。不过,定位器对于其他viewmodels来说效果太好了。我希望您会发现它很有用。我认为这是一个非常好的选择,尤其是对于模块/视图数量开始增长的大型应用程序。