从MainWindow(使用Telerik)访问页面的DataContext

时间:2018-08-31 07:59:22

标签: c# wpf mvvm viewmodel datacontext

我是WPF的新手,偶然发现了一个似乎无法解决的问题。

我确定已经有一个关于此类问题的话题,但是由于我缺乏知识,很可能我没有找到它或者只是根本不了解它。

我的问题:

我正在用C#开发WPF应用程序。这是一个Outlook样式的应用程序,具有一个大型MainWindow和一个大型ViewModel和XAML。 我试图做的是稍微分割单个代码文件,使其更加模块化和紧凑。 我使用的是Telerik控件,并试图将单个SplitContainers的内容外包到Pages中,直到现在为止,效果还不错。

今天,出现了一种新情况,它某种程度上是愚蠢的,看上去并不太复杂,但是某种程度上,我却无法使其正常工作。

情况:

我的“ MainWindow”中有一个Treeview,每当我在其中更改选择时,我都想更改我绑定到的Page上的属性。

因此,当我单击“ TreeView_3”中的项目时,我想通过EventHandler(SelectionChanged_TreeView3)在“ Page_X”的DataContext上设置属性。

如果必须在MainWindow上执行此操作,通常会这样:

UserViewModel uvm = mainGrid.DataContext as UserViewModel;

然后只需调用我要访问的特定UserViewModel(MainWindow的ViewModel)的任何属性即可。

显然,我无法以相同的方式对页面执行此操作,因为“ mainGrid.DataContext”将始终引用MainWindow,因为这是事件处理程序的调用位置。

因此,我需要对如何从具有不同ViewModel的页面访问DataContext进行一些解释。

如果您需要任何代码来解释,请告诉我。

2 个答案:

答案 0 :(得分:0)

如果没有一些示例代码,很难说。但这可能是您需要在ViewModels上实现INotifyPropertyChanged吗?

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

通过调用OnPropertyChanged(“ PropertyName”);在viewmodel属性的设置器中,ui将接管更改。

还要确保两个视图都引用同一对象,而不是同一对象的副本。

答案 1 :(得分:0)

您需要分开关注的地方。在后面的代码中,您应该只有处理 view 相关内容的代码。通常,我的后台代码为空。

在ViewModels中,您应该处理与 data 相关的逻辑。因此,与其在视图代码中强制转换数据上下文,不如在视图模型中使用Command处理单击。

由于无法将命令绑定到SelectedItemChanged的{​​{1}},因此可以使用交互触发器。

TreeView