2015-12-14 52 views
0

在WPF模型綁定中,可以通過在您的app.xaml中放置DataTemplate以及viewmodel和視圖類型來實現綁定。然後,您可以將視圖模型綁定到contentpresenter,如果您通過某種事件更改了視圖模型,則視圖會發生變化。通用Windows應用程序中的ViewModel-View綁定

這裏的舊代碼:

的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語法no lon ger工作。我讀過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

那麼我有一個Windows 8.1的WPF應用程序工作,然後我將代碼移到一個Windows 10通用應用程序和'Application.Resources'不再有效,我收到奇怪的錯誤消息。 –

+0

如果沒有DataTemplate ContentTemplate屬性的類型是什麼? – Maximus

回答

3

在WPF中,DataType是一個可以在運行時檢索的依賴項屬性。

在UWP中,x:DataType是編譯時屬性,您無法在運行時獲取該值。 x:DataType正與{x:Bind}一起工作。在Application.Resources中使用x:DataType時,由於編譯器無法生成代碼,因此會引起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?

+0

這似乎與舊的語法相去甚遠,而且更加複雜 - 我試圖實現它,並且遇到了datatemplateselector項參數總是返回null的問題。我會再試一次,看看我是否有其他地方,但迄今沒有骰子:( –

相關問題