我是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进行一些解释。
如果您需要任何代码来解释,请告诉我。
答案 0 :(得分:0)
如果没有一些示例代码,很难说。但这可能是您需要在ViewModels上实现INotifyPropertyChanged吗?
通过调用OnPropertyChanged(“ PropertyName”);在viewmodel属性的设置器中,ui将接管更改。
还要确保两个视图都引用同一对象,而不是同一对象的副本。
答案 1 :(得分:0)
您需要分开关注的地方。在后面的代码中,您应该只有处理 view 相关内容的代码。通常,我的后台代码为空。
在ViewModels中,您应该处理与 data 相关的逻辑。因此,与其在视图代码中强制转换数据上下文,不如在视图模型中使用Command
处理单击。
由于无法将命令绑定到SelectedItemChanged
的{{1}},因此可以使用交互触发器。
TreeView