2010-04-22 45 views

回答

8

我說創建V和VM可用之前的任何數據;在VM中設置一次可用的數據。

在數據加載之前顯示IsLoading指示器,並將數據加載到單獨的線程中。否則,如果數據需要一段時間加載,你會得到可怕的WPF黑屏。

即使您需要等待數據加載,視圖加載時視覺效果會更好,但感覺會更快。

+0

我想接下來的問題是:那是什麼是模型進入ViewModel的最佳方式嗎?我寧願虛擬機不負責直接獲取模型 – Schneider 2010-04-22 12:27:31

+0

讓模型成爲您在視圖模型上設置的屬性 – 2010-04-23 02:36:59

4

我所做的是立即創建我的虛擬機和查看,並顯示視圖。

與許多應用程序一樣,除了「啓動狀態」枚舉(可立即使用),在啓動過程中不斷更新,發送到VM,然後到達進度條我的看法。

我的虛擬機訂購了模型中的事件,這些事件發生時會推送到虛擬機中。在查看XAML I數據綁定到VM的每個VM屬性。

通過這種方式,用戶隨時瞭解情況。

1

僅創建視圖沒有視圖模型是IMO毫無意義 - 從視圖的所有綁定屬性怎麼樣?由於沒有ViewModel,它們沒有任何約束。你沒有看到任何例外的事實並不意味着一切都OK :)

當然你應該instanciate你的ViewModels的所有視圖(當然在此刻使用的視圖:))在一開始 - 這是不只是建議,但需要。

2

我已經採納了Josh Smith在MSDN上的文章中所做的事here...向下滾動到部分,他討論瞭如何將View應用於ViewModel。在這樣做的時候,視圖是在ViewModel被渲染時創建的。沒有必要手動創建視圖,然後再將DataContext分配給ViewModel。這會自動爲你做。

「你可以很容易地告訴WPF如何使用類型的DataTemplates渲染視圖模型對象的類型化的DataTemplate沒有一個X:分配給它的關鍵價值,但它確實有它的數據類型屬性設置爲實例如果WPF試圖呈現其中一個ViewModel對象,它將檢查資源系統是否有一個類型化的DataTemplate,它的DataType與您的ViewModel對象的類型(或基類)相同。如果它找到一個,它將使用該模板來呈現由選項卡項目的Content屬性引用的ViewModel對象。「

換句話說,你會創建視圖模型,如下所示:

MyViewModel viewModel = new MyViewModel(); 

// Add the view model to the content of some control (TabItem, Grid, Window, etc.) 
// NOTE: You wouldn't actually make this call... instead you would add the 
// ViewModel to a collection or a property and the parent would bind 
// to it and display it properly 
MyContainer.Content = viewModel; 

而在你的ResourceDictionary中,你將定義如下:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:DemoApp.ViewModel" 
    xmlns:vw="clr-namespace:DemoApp.View" 
    > 

    <!-- NOTE: The View must be a UserControl (or page) --> 
    <DataTemplate DataType="{x:Type vm:MyViewModel}"> 
     <vw:MyView /> 
    </DataTemplate> 

</ResourceDictionary> 
+0

我很熟悉wi這種模式,並使用了它幾次...但關於它的東西總是給我heebeejeebees! – Schneider 2010-04-22 12:26:11

+1

哈哈,我認爲這是因爲它「神奇地」爲您呈現ViewModel而沒有創建視圖。我明白了。起初我也有點懷疑,但在思考了一段時間之後,我意識到這真的有多強大。想想看...你可以把你的ViewModel放在任何地方!這允許您的應用程序在運行時從標籤式MDI界面更改爲Windows MDI界面(或其他),而不需要更改代碼。這就是我喜歡它的原因。 – Brent 2010-04-22 13:05:43

+0

一個缺點是可混合性...在編輯用戶控件時datacontext中沒有數據 – Schneider 2010-04-22 14:25:43

相關問題