我有一個從數據源加載數據的WPF應用程序。創建ViewModel:在模型數據可用之前或之後執行此操作?
在加載某些數據之前,不會顯示任何內容。
我的問題是我:
- 創建V和VM可用之前的任何數據;設置VM中的數據一旦可用
- 在開始時只創建V;等到現有的數據,然後創建VM注入數據
- 創建V和VM只有一次的可用數據
我有一個從數據源加載數據的WPF應用程序。創建ViewModel:在模型數據可用之前或之後執行此操作?
在加載某些數據之前,不會顯示任何內容。
我的問題是我:
我說創建V和VM可用之前的任何數據;在VM中設置一次可用的數據。
在數據加載之前顯示IsLoading指示器,並將數據加載到單獨的線程中。否則,如果數據需要一段時間加載,你會得到可怕的WPF黑屏。
即使您需要等待數據加載,視圖加載時視覺效果會更好,但感覺會更快。
我所做的是立即創建我的虛擬機和查看,並顯示視圖。
與許多應用程序一樣,除了「啓動狀態」枚舉(可立即使用),在啓動過程中不斷更新,發送到VM,然後到達進度條我的看法。
我的虛擬機訂購了模型中的事件,這些事件發生時會推送到虛擬機中。在查看XAML I數據綁定到VM的每個VM屬性。
通過這種方式,用戶隨時瞭解情況。
僅創建視圖沒有視圖模型是IMO毫無意義 - 從視圖的所有綁定屬性怎麼樣?由於沒有ViewModel,它們沒有任何約束。你沒有看到任何例外的事實並不意味着一切都OK :)
當然你應該instanciate你的ViewModels的所有視圖(當然在此刻使用的視圖:))在一開始 - 這是不只是建議,但需要。
我已經採納了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>
我很熟悉wi這種模式,並使用了它幾次...但關於它的東西總是給我heebeejeebees! – Schneider 2010-04-22 12:26:11
哈哈,我認爲這是因爲它「神奇地」爲您呈現ViewModel而沒有創建視圖。我明白了。起初我也有點懷疑,但在思考了一段時間之後,我意識到這真的有多強大。想想看...你可以把你的ViewModel放在任何地方!這允許您的應用程序在運行時從標籤式MDI界面更改爲Windows MDI界面(或其他),而不需要更改代碼。這就是我喜歡它的原因。 – Brent 2010-04-22 13:05:43
一個缺點是可混合性...在編輯用戶控件時datacontext中沒有數據 – Schneider 2010-04-22 14:25:43
我想接下來的問題是:那是什麼是模型進入ViewModel的最佳方式嗎?我寧願虛擬機不負責直接獲取模型 – Schneider 2010-04-22 12:27:31
讓模型成爲您在視圖模型上設置的屬性 – 2010-04-23 02:36:59