在WPF中,可以通过在DataTemplate中放置带有视图模型和视图类型的app.xaml来实现模型绑定。然后,您只需将视图模型绑定到内容演示器,如果通过某种事件更改视图模型,则视图将发生更改。
这是旧代码:
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)
然而,数据板语法不再起作用。我已经阅读了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抱怨视图模型不在我提供的命名空间中。
XBF generation error code 0x09c4。
在Windows 10通用应用程序中,此操作的等效语法是什么?
发布于 2015-12-15 08:33:38
在WPF中,DataType是一个依赖项属性,可以在运行时中检索。
在UWP中,x:DataType是编译时属性,不能在运行时获得值。x:DataType正在与{x:Bind}合作。当在x:DataType中使用Application.Resources时,它会引发XBF generation error,因为编译器无法生成代码。{x:Bind}取决于代码生成,如果在资源字典中使用{x:Bind},则资源字典需要有一个代码隐藏类。然后,您可以通过实例化它的类型而不是引用它的文件名来重用资源字典。有关如何在资源字典中使用{x:Bind}的详细信息,请参阅具有{x:Bind}的资源字典。
如果需要根据模型类型切换DataTemplate,则需要使用DataTemplateSelector类。
有关如何通过如何将视图与视图模型或多个DataTemplates关联为ViewModel?映射UWP中的数据类型和数据模板的示例,请参见类似的案例:DataTemplateSelector。
https://stackoverflow.com/questions/34273385
复制相似问题