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

我对 WPF 比较陌生,我偶然发现了一个我似乎无法找到解决方案的问题。

我确信已经有一个线程涉及这样的问题,但由于我缺乏知识,很可能我还没有找到它或根本不理解它。

我的问题:

我正在用 C# 开发 WPF 应用程序。这是一个 Outlook 风格的应用程序,带有一个带有巨大 ViewModel 和 XAML 的大型 MainWindow。我试图做的是将单个代码文件分开一点,使其更加模块化和紧凑。我正在使用 Telerik Controls 并尝试将单个 SplitContainers 的内容外包到 Pages 中,直到现在它都运行良好。

今天,出现了一个新情况,有点愚蠢,看起来也不太复杂,但不知何故我无法让它发挥作用。

情况:

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

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

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

UserViewModel uvm = mainGrid.DataContext as UserViewModel;

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

显然,我不能以相同的方式为页面执行此操作,因为“mainGrid.DataContext”将始终引用 MainWindow,因为这是调用 eventhandler 的地方。

所以我需要的是关于如何从具有不同 ViewModel 的页面访问 DataContext 的一些解释。

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


墨色风雨
浏览 200回答 2
2回答

人到中年有点甜

你需要分开你的顾虑。在您后面的代码中,您应该只有处理视图相关内容的代码。大多数情况下,我的代码隐藏是空的。在您的 ViewModel 中,您应该处理与数据相关的逻辑。因此,不要在后面的代码中投射数据上下文,而是Command在视图模型中使用 a 处理单击。由于无法将命令绑定到SelectedItemChanged您的 ,因此TreeView您可以使用交互触发器。<TreeView xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">&nbsp; &nbsp; <i:Interaction.Triggers>&nbsp; &nbsp; &nbsp; &nbsp; <i:EventTrigger EventName="SelectedItemChanged">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>&nbsp; &nbsp; &nbsp; &nbsp; </i:EventTrigger>&nbsp; &nbsp; </i:Interaction.Triggers></TreeView>

紫衣仙女

如果没有一些示例代码,Ruven 很难说。但可能是您需要在 ViewModel 上实现 INotifyPropertyChanged?https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification通过调用 OnPropertyChanged("PropertyName");&nbsp;在 viewmodel 属性的 setter 中,ui 将获取更改。还要确保两个视图都引用同一个对象,而不是同一个对象的副本。
打开App,查看更多内容
随时随地看视频慕课网APP