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的不同对象,但我应该只有一个。

WPF 数据模板和自动创建的视图模型对象

你的问题实际上在这里:

<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 属性的值。