从 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?
通过调用 OnPropertyChanged("PropertyName");在视图模型 属性 的 setter 中,ui 将接受更改。
还要确保两个视图都引用同一个对象而不是同一个对象的副本。
你需要分开你的关注点。在您后面的代码中,您应该只有处理 view 相关内容的代码。通常我的代码隐藏是空的。
在您的 ViewModel 中,您应该处理与 data 相关的逻辑。因此,与其在您的代码后面投射数据上下文,不如在您的视图模型中使用 Command
处理点击。
由于无法将命令绑定到 TreeView
的 SelectedItemChanged
,您可以使用交互触发器。
<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>
我对 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?
通过调用 OnPropertyChanged("PropertyName");在视图模型 属性 的 setter 中,ui 将接受更改。
还要确保两个视图都引用同一个对象而不是同一个对象的副本。
你需要分开你的关注点。在您后面的代码中,您应该只有处理 view 相关内容的代码。通常我的代码隐藏是空的。
在您的 ViewModel 中,您应该处理与 data 相关的逻辑。因此,与其在您的代码后面投射数据上下文,不如在您的视图模型中使用 Command
处理点击。
由于无法将命令绑定到 TreeView
的 SelectedItemChanged
,您可以使用交互触发器。
<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>