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

Access DataContext of Page from MainWindow (with Telerik)

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

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

我的问题:

我正在用 C# 开发 WPF 应用程序。这是一个 Outlook 风格的应用程序,有一个大的主窗口,一个巨大的 ViewModel 和 XAML。 我想做的是稍微拆分单个代码文件,使其更加模块化和紧凑。 我正在使用 Telerik Controls 并尝试将单个 SplitContainer 的内容外包到页面中,直到现在它都运行良好。

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

情况:

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

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

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

UserViewModel uvm = mainGrid.DataContext as UserViewModel;

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

显然我不能以相同的方式对页面执行此操作,因为 "mainGrid.DataContext" 将始终引用 MainWindow,因为这是调用事件处理程序的地方。

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

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

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

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

通过调用 OnPropertyChanged("PropertyName");在视图模型 属性 的 setter 中,ui 将接受更改。

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

你需要分开你的关注点。在您后面的代码中,您应该只有处理 view 相关内容的代码。通常我的代码隐藏是空的。

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

由于无法将命令绑定到 TreeViewSelectedItemChanged,您可以使用交互触发器。

<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>