为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
墨色风雨 2021-12-25 16:17:50
我对 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 的一些解释。如果您需要任何代码来解释,请告诉我。
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

你需要分开你的顾虑。在您后面的代码中,您应该只有处理视图相关内容的代码。大多数情况下,我的代码隐藏是空的。


在您的 ViewModel 中,您应该处理与数据相关的逻辑。因此,不要在后面的代码中投射数据上下文,而是Command在视图模型中使用 a 处理单击。


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


<TreeView xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">

    <i:Interaction.Triggers>

        <i:EventTrigger EventName="SelectedItemChanged">

            <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>

        </i:EventTrigger>

    </i:Interaction.Triggers>

</TreeView>


查看完整回答
反对 回复 2021-12-25
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

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

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

通过调用 OnPropertyChanged("PropertyName"); 在 viewmodel 属性的 setter 中,ui 将获取更改。

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


查看完整回答
反对 回复 2021-12-25
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信