WPF:使用DataTemplates切换视图-如何让视图自动更改其DataContext
本文关键字:视图 DataContext 使用 DataTemplates WPF | 更新日期: 2023-09-27 18:26:42
提前感谢您对我的帮助!我马上跳进去!
假设我有以下XAML。我遗漏了不需要的部分,希望能让它更容易阅读。
TreeView
通过创建MainViewModelBase
对象的ObservableCollection填充在MainWindow代码后面。这些对象的属性基于主窗口代码在启动时读入的XML文件。
这使得类型为MainViewModelBase
的TreeView
的项目。从那里,我想使用Treeview
的SelectedItem
的字符串"Type"属性(从XML中读取)在屏幕右侧显示UserControl。以下代码基于谷歌搜索的TON,使用DataTemplates来完成视图切换。
我的问题是。我要填充的UserControl需要绑定到另一个XML文件,该XML文件的名称将基于存储在MainViewModelBase
中的名为name的字符串。下面的代码显示了新视图,但我不知道如何将新视图DataContext设置为XML。内容控件必须有某种方法才能做到这一点。我认为,当你使用DataTemplate进行切换时,得到的视图会继承"创建"它的ViewModel类型的DataContext。但我认为,直到视图的构造函数完成后,才会设置DataContext。因此,我不能让视图的构造函数基于MainViewModel的字符串"name"打开XML。有没有办法在事后更新DataContext?谢谢
另一个注意事项是,TreeView
中有很多项,因此有很多XML。我不想一次将所有XML都存储在内存中,只有在需要它的视图需要它的时候
最后,我是WPF的新手,所以如果我以上问题的一部分是愚蠢的或完全令人困惑的,我提前道歉。我是从一个新技术的人的角度来问他们的。
注意:我知道我可以将TreeView
直接绑定到初始XML,将来可能会切换到那个,我还不确定。大多数在线示例都是使用VeiwModel对象的ObservableCollections,因此通过这种方式学习更容易。
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="BlankTemplate" DataType="{x:Type ViewModel:MainViewModelBase}">
<View:BlankControl/>
</DataTemplate>
<DataTemplate x:Key="ParagraphTemplate" DataType="{x:Type ViewModel:MainViewModelBase}">
<View:ParagraphControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:MainViewModelBase}">
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource BlankTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Type}" Value="Paragraph">
<Setter Property="ContentTemplate" Value="{StaticResource ParagraphTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</Window.Resources>
<DockPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=".5*"/>
<ColumnDefinition Width=".5*"/>
</Grid.ColumnDefinitions>
<TreeView Name="navigationPane" Grid.Column="0"/>
<ContentControl Grid.Column="1" Content="{Binding ElementName=navigationPane, Path=SelectedItem}"/>
</Grid>
在阅读了你的帖子后,如果我没有错的话,你基本上在左手边有一个树视图,根据选择,你想在右手边填充一些用户控件。这就是要求的关键。
如果是以上情况,可以做的是将左侧视图和右侧视图绑定到单独的视图模型。从左侧选择某个内容时,可以在右侧视图的参数化构造函数中传递选择。因此,您将在LHS上选择输入,并可以在RHS 上进行处理
经过更多的谷歌搜索,我在codeproject上发现了一个很棒的项目,它描述了如何使用视图模型的思想来加载命令树视图。我真正喜欢它的地方是,它向我展示了如何使用INotifyPropertyChanged的东西将isSelected属性绑定到视图模型中的一些东西,这些东西可以用来加载XML等。
我知道这对WPF大师来说可能是基本的,但这对我解释如何真正使用ViewModel模式非常有帮助。
http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode