【问题标题】:WPF datatemplates and automatically created object of viewModelWPF 数据模板和自动创建的 viewModel 对象
【发布时间】:2014-12-20 22:05:35
【问题描述】:

我想在我的 WPF 应用程序中实现导航(使用 MVVM 模式)。 存在以下 ViewModel:

  • MainViewModel:我的应用程序“框架”包含一个功能区
  • ConsignorViewModel:必须在 “框架”
  • RecipientViewModel:另一个“子”视图 ...

为了让 WPF 决定必须在“框架”中显示哪个视图,我使用 DataTemplates,在 App.xaml 中声明如下:

<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 有一个 ViewModel 类型的属性“CurrentViewModel”(我的基类)。 ConsignorViewModel 和 RecipientViewModel 是 ViewModel。

ConsignorViewModel 的视图是“用户控件”(窗口不适用于功能区)。

<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必须绑定到usercontrol是不是错了?

更新 我找到了问题,但没有找到解决方案: 启动应用程序时,会创建一个新的 MainViewModel 对象。因此我说

currentViewModel = new ConsignorViewModel();

现在我的子视图是 ConsignorUC。当创建一个新的 ConsignorUC 时,会创建一个新的 ConsignorViewModel 对象。所以我必须有不同的ConsignorViewModel对象,但我应该只有一个。

【问题讨论】:

  • 为什么改标题?您的问题中没有关于多线程的内容,因此标题有点混乱。
  • 对不起,我以为有不同的“线程”。似乎并非如此。希望新标题更好。

标签: c# wpf mvvm datatemplate


【解决方案1】:

你的问题其实就在这里:

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

【讨论】:

  • 非常感谢。这就是解决方案。不知道这种可能性,必须更深入地研究 XAML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2011-10-02
  • 2021-02-21
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多