2011-07-05 72 views
1

MainWindow.xaml,我設置:在App.xaml中聲明WPF隱含的DataTemplate不會生效

<Window.DataContext> 
    <vm:MainViewModel/> 
</Window.DataContext> 

App.xaml文件,我增加了以下內容:

<Application.Resources> 
    <DataTemplate DataType="vm:MainViewModel"> 
    <v:MainView/> 
    </DataTemplate> 
</Application.Resources> 

我希望MainWindow將自動加載並顯示MainView,並將其0123PO屬性設置爲窗口的屬性(在設計時將其設置爲MainViewModel,如上),但它不起作用 - MainWindow不使用在App.xaml中設置的DataTemplate

這種情況下的任何更好的想法?

回答

4

你應該做一個小的修改 -

首先,在你的窗口中。試試這個:

<Window> 
    <!-- setup window... --> 

    <ContentPresenter> 
     <ContentPresenter.Content> 
      <vm:MainViewModel/> 
     </ContentPresenter.Content> 
    </ContentPresenter>  
</Window> 

這會在您的窗口中創建一個內容項。 DataTemplates通過將內容映射到新視圖來工作 - 在這種情況下,由於此處的內容是MainViewModel,它會自動爲您創建並實例化新的MainView。設置DataContext將不會觸發DataTemplates,因爲您從不製作對象的ViewModel「內容」。

您可以只直接設置窗口中的內容縮短這個,如果你喜歡:

<Window> 
    <Window.Content> 
    <vm:MainViewModel/> 
    </Window.Content> 
</Window> 

或者,甚至,結合內容給DataContext(雖然這僅是有道理的,如果你需要爲DataContext集一些其他的目的):

<Window Content="{Binding}"> 
    <Window.DataContext> 
    <vm:MainViewModel/> 
    </Window.DataContext> 
</Window> 
+0

有沒有更通用的方法來使其依賴於App.xaml設置? – Shimmy

+1

@Shimmy:你想做什麼?你所做的是有效地試圖「將窗口變成MainView」,這是行不通的。您需要在某些時候將Window的內容設置爲ViewModel,並且它可以正常工作。如果你願意的話,你可以使用''而不是放入一個'ContentPresenter''(我只是覺得另一個更清晰。 ..) –

+0

爲了清晰和簡潔,我已經更新了答案。這回答了我的問題。 – Shimmy

4

我想你需要

<DataTemplate DataType="{x:Type vm:MainViewModel}"> 

編輯:

我真的不認爲我錯了,代碼

<Window.DataContext> 
    <WpfApplication1:ViewModel /> 
</Window.DataContext> 
<Window.Resources> 
    <DataTemplate DataType="{x:Type WpfApplication1:ViewModel}"> 
     <TextBlock>Custom template</TextBlock> 
    </DataTemplate> 
</Window.Resources> 
<ContentPresenter Content="{Binding}" /> 

顯示「自定義模板」。如果我刪除x:Type,則顯示的是「WpfApplication1.ViewModel」,它是在視圖模型對象上調用ToString()的結果。這用於沒有DataTemplate

+1

'「{x:Type vm:MainViewModel}」'基本上和''vm:MainViewModel「'一樣。 WPF有一個類型轉換器,它將字符串解釋爲一個類型,所以不幸的是它沒有幫助。 – Shimmy

+0

@Shimmy,是的,但該類型轉換器不適用於'DataType',因爲它的類型是'object'。所以你需要使用'x:Type',[文檔](http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx)甚至提到它。 – svick

+0

你錯了。文檔中提到你應該使用'typename',它可以從字符串中解釋。 – Shimmy

相關問題