在数据上下文中使用 Prism 和 XAML 绑定视图的 Master Detail MVVM
Master Detail MVVM with Prism and XAML binding view in data context
我有以下虚拟应用程序,我试图在其中构建具有两个视图的主从。第一个是集合视图,我可以成功地 select 它的一个元素,它显示在 Content Presenter 数据模板中,其中定义的 TextBlock 和 TextBox 如下所示。
我已尝试将 TextBlock 和 TextBox 移出到视图中,但未能成功显示数据。如果我删除 TB 并取消注释视图,它将显示该视图,但视图中的 TB 不会填充。
当然,我的想法是,我会不止一种。
主窗口
<Window x:Class="MyApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:MyApp.Views"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
xmlns:viewModel="clr-namespace:MyApp.ViewModels"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="LayoutRoot">
<StackPanel Orientation="Horizontal">
<views:CollectionView DataContext="{Binding myItemCollection}">
</views:CollectionView>
<ContentPresenter x:Name="Detail" Content="{Binding myItemCollection.SelectedViewModel}">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewModel:TextViewModel}">
<StackPanel>
<TextBlock Text="{Binding Name}"></TextBlock>
<TextBox Text="{Binding Text}"></TextBox>
<!--<views:TextView/>-->
</StackPanel>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</StackPanel>
</Grid>
TextView
<UserControl x:Class="MyApp.Views.TextView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyApp.Views"
xmlns:viewModel="clr-namespace:MyApp.ViewModels"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<StackPanel>
<TextBlock Text="Text Item"/>
<TextBlock Text="{Binding Name}"></TextBlock>
<TextBox Text="{Binding Text}"></TextBox>
</StackPanel>
</Grid>
您需要从 TextView
中删除 prism:ViewModelLocator.AutoWireViewModel="True"
属性。
它所做的是从容器中提取适当的视图模型并将视图模型分配给 TextView.DataContext
。另一方面,在您的模板中,您没有明确地将模板化数据传递给 TextView
控件,因此它应该通过 DataContext
的自动继承来继承。但这不起作用,因为 TextView.DataContext
是由 prism:ViewModelLocator.AutoWireViewModel="True"
.
明确设置的
如果需要使用视图模型自动连接,您始终可以从引用范围设置此属性,即在 XAML 中,您的视图是 "used",例如:
<StackPanel>
<views:TextView prism:ViewModelLocator.AutoWireViewModel="True" />
</StackPanel>
我有以下虚拟应用程序,我试图在其中构建具有两个视图的主从。第一个是集合视图,我可以成功地 select 它的一个元素,它显示在 Content Presenter 数据模板中,其中定义的 TextBlock 和 TextBox 如下所示。
我已尝试将 TextBlock 和 TextBox 移出到视图中,但未能成功显示数据。如果我删除 TB 并取消注释视图,它将显示该视图,但视图中的 TB 不会填充。
当然,我的想法是,我会不止一种。
主窗口
<Window x:Class="MyApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:MyApp.Views"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
xmlns:viewModel="clr-namespace:MyApp.ViewModels"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="LayoutRoot">
<StackPanel Orientation="Horizontal">
<views:CollectionView DataContext="{Binding myItemCollection}">
</views:CollectionView>
<ContentPresenter x:Name="Detail" Content="{Binding myItemCollection.SelectedViewModel}">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewModel:TextViewModel}">
<StackPanel>
<TextBlock Text="{Binding Name}"></TextBlock>
<TextBox Text="{Binding Text}"></TextBox>
<!--<views:TextView/>-->
</StackPanel>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</StackPanel>
</Grid>
TextView
<UserControl x:Class="MyApp.Views.TextView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyApp.Views"
xmlns:viewModel="clr-namespace:MyApp.ViewModels"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<StackPanel>
<TextBlock Text="Text Item"/>
<TextBlock Text="{Binding Name}"></TextBlock>
<TextBox Text="{Binding Text}"></TextBox>
</StackPanel>
</Grid>
您需要从 TextView
中删除 prism:ViewModelLocator.AutoWireViewModel="True"
属性。
它所做的是从容器中提取适当的视图模型并将视图模型分配给 TextView.DataContext
。另一方面,在您的模板中,您没有明确地将模板化数据传递给 TextView
控件,因此它应该通过 DataContext
的自动继承来继承。但这不起作用,因为 TextView.DataContext
是由 prism:ViewModelLocator.AutoWireViewModel="True"
.
如果需要使用视图模型自动连接,您始终可以从引用范围设置此属性,即在 XAML 中,您的视图是 "used",例如:
<StackPanel>
<views:TextView prism:ViewModelLocator.AutoWireViewModel="True" />
</StackPanel>