通用Windows应用程序中的ViewModel-View绑定

时间:2015-12-14 17:45:51

标签: wpf xaml uwp

在WPF模型中,可以通过在app.xaml中放置带有viewmodel和视图类型的DataTemplate来实现绑定。然后,您可以将视图模型绑定到contentpresenter,如果您通过某种事件更改了视图模型,则视图会发生变化。

这是旧代码:

App.xaml(AView和BView只是用户控件)

<Application.Resources>
    <DataTemplate DataType="{x:Type viewModels:AViewModel}">
        <views:ViewA/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type viewModels:BViewModel}">
        <views:ViewB/>
    </DataTemplate>
</Application.Resources>

然后在某种包含当前上下文的子视图中:

<ContentPresenter Content="{Binding CurrentViewModel}" />

(很像https://stackoverflow.com/a/22376718/82333

但是,datatemplate语法不再有效。我已经阅读了x:bind,但是对viewmodel类型进行基本替换并没有解决它。

使用以下语法:

<Application.Resources>
    <DataTemplate x:Key="ViewAKey" x:DataType="viewModels:AViewModel">
        <views:ViewA/>
    </DataTemplate>
    <DataTemplate x:Key="ViewBKey" x:DataType="viewModels:BViewModel">
        <views:ViewB/>
    </DataTemplate>
</Application.Resources>

导致多个错误:

Visual Studio抱怨视图模型不在我提供的命名空间中。

XBF generation error code 0x09c4

Windows 10 Universal Apps中此操作的等效语法是什么?

1 个答案:

答案 0 :(得分:3)

在WPF中,DataType是一个依赖属性,可以在运行时检索。

在UWP中,x:DataType是编译时属性,您无法在运行时获取该值。 x:DataType正与{x:Bind}合作。在x:DataType中使用Application.Resources时,它会引发XBF generation error,因为编译器无法生成代码。 {x:Bind}依赖于代码生成,如果在资源字典中使用{x:Bind},则资源字典需要具有代码隐藏类。然后,您可以通过实例化其类型而不是引用其文件名来重用资源字典。有关如何在资源字典中使用{x:Bind}的详细信息,请参阅Resource dictionaries with {x:Bind}

如果我们需要根据模型类型切换DataTemplate,我们需要使用DataTemplateSelector class

有关如何通过DataTemplateSelector在UWP中映射数据类型和数据模板的示例,请参阅类似案例:How to associate view with viewmodel or multiple DataTemplates for ViewModel?