在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中此操作的等效语法是什么?
答案 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?。