2011-03-03 69 views
1

我最近開始學習WPF + MVVM。這可能會導致棍棒或錯誤棍棒的錯誤結局與事情應該完成的方式完全相同。通過名稱設置ContentTemplate時的差異比通過類型推斷

我想創建一個簡單的訂單應用程序,它有訂單項目,每個訂單都有lineitems。主頁上有兩個部分,(首先他們都是usercontrols)。

頂部綁定到訂單列表。底部與當前選定的訂單綁定(想法是顯示該訂單的細節)。

細節視圖需要能夠查看/編輯和添加新項目。爲此,我想我應該有兩個視圖/模板,編輯順序視圖和新訂單視圖/模板。在閱讀過程中,我遇到了數據模板,並認爲這將是實現這一目標的好方法。

在我mainwindow.xaml我有訂單列表視圖約束如下:

<ContentControl Content="{Binding Path=OrdersViewModel}" 

的觀點是掛接在資源文件有:

<DataTemplate DataType="{x:Type vm:AllOrdersViewModel}"> 
    <vw:AllOrdersView /> 
</DataTemplate> 

這個偉大的工程的時候,應用程序啓動後,它們顯示訂單。我對訂單細節做了同樣的處理(例如,它只設置了數據類型而不是定義的任何鍵),這很有效,如果沒有選擇訂單,那麼視圖將不會顯示,選擇訂單時它會顯示

我目前正在嘗試將其更改爲模板,以便我可以動態地切換模板/視圖,以便當用戶單擊新命令時(viewmodel具有一個聲明訂單當前狀態的Enum,所以我將檢查對枚舉值),視圖應該改變

如果我嘗試以下它將炸燬。應用程序啓動,顯示訂單列表(此時沒有訂單被選中),和細節視圖顯示,然後由於dependencyproperty.unsetvalue,其中一個轉換器將爆炸,(請注意,我應該經常檢查嗎?)。理想情況下,我不希望被顯示的視圖,直到選擇的順序:

<ContentControl Content="{Binding Path=OrderViewModel}" ContentTemplate="{StaticResource ordertemplate}" /> 

    <DataTemplate x:Key="ordertemplate"> 
     <TextBlock Text="hello" /> 
    </DataTemplate> 

我主要有兩個問題:

1)我怎麼會阻止顯示,直到有數據顯示模板?

2)如何根據枚舉動態地切換視圖/模板?

回答

2

用於這種情況的最直接的機制是DataTemplateSelector,它包含您編寫的代碼,可以檢查綁定的對象,在這種情況下您的ViewModel,並選擇適當的模板使用,包括處理沒有詳細選擇。

<ContentControl Content="{Binding Path=OrderViewModel}" 
       ContentTemplateSelector="{StaticResource MyCustomSelector}" /> 
+0

謝謝約翰,那很好。前幾天我看了一個模板選擇器,但從來沒有工作。 (這次花了5分鐘)。我想我現在開始更多地理解「小」的事情。再次感謝。 – Jon 2011-03-03 16:52:08