WPF 数据模板和自动创建的视图模型对象
本文关键字:创建 视图 模型 对象 数据 WPF | 更新日期: 2023-09-27 18:34:44
我想在我的WPF应用程序中实现导航(使用MVVM模式(。存在以下视图模型:
- 主视图模型:包含功能区的应用程序的"框架">
- ConsignorViewModel:必须在"框架"
- 收件人视图模型:另一个"子"视图...
为了让 WPF 决定必须在"框架"中显示的视图,我使用了在 App.xaml 中声明的 DataTemplates,如下所示:
<Application x:Class="MyProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="clr-namespace:MyProject.ViewModels"
xmlns:views="clr-namespace:MyProject"
StartupUri="MainWindow.xaml">
<Application.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
<DataTemplate DataType="{x:Type viewModels:ConsignorViewModel}">
<views:ConsignorUC />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:RecipientViewModel}">
<views:RecipientUC />
</DataTemplate>
</Application.Resources>
</Application>
我的 MainViewModel 有一个属性"CurrentViewModel",类型为 ViewModel(我的基类(。ConsignorViewModel 和 RecipientViewModel 是 ViewModel。
委托人视图模型的视图是"用户控件"(窗口不适用于功能区(。
<UserControl x:Class="MyProject.ConsignorUC"
...>
<UserControl.DataContext>
<local:ConsignorViewModel />
</UserControl.DataContext>
<Grid>
...
<TextBox Name="searchterm" Margin="10,10,1,1" TextWrapping="Wrap" Text="{Binding SearchTerm, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" />
...
</Grid>
</Grid>
</UserControl>
双向数据绑定在子视图中不起作用。我错过了什么吗?说 ConsignorViewModel 必须绑定到用户控件是错误的吗?
更新我发现了问题,但没有找到解决方案:启动应用程序时,将创建一个新的 MainViewModel 对象。因此我说
currentViewModel = new ConsignorViewModel();
现在我的子视图是发货人UC。创建新的 ConsignorUC 时,将创建一个 ConsignorViewModel 的新对象。所以我必须对ConsignorViewModel的不同对象,但我应该只有一个。
你的问题实际上在这里:
<UserControl.DataContext>
<local:ConsignorViewModel />
</UserControl.DataContext>
显式创建新的视图模型,并将其分配给该视图创建时的视图的DataContext
属性。
只需将其替换为类似
<UserControl
x:Class="MyProject.ConsignorUC"
DataContext = "{Binding DataContext.CurrentViewModel, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}"/>
使用此方法,可以将子视图的DataContext
设置为窗口视图模型的 CurrentViewModel
属性的值。