[英]WPF - MVVM Viewmodel setup
我正在使用我的mvvm應用程序正在使用的設置存在一些問題。 看過這里的一些帖子,我覺得我可能會做這個有點錯誤。
我有幾個包含子模型列表的模型,例如:
我們目前沒有任何與這些模型直接相關的視圖模型,我們只是簡單地擁有代表模型列表的視圖模型,例如我們有一個proformalistviewmodel,它只包含一個proformas列表。
我的問題是,對於這個設置我有點困惑的是什么viewmodel應該擁有哪些數據,例如ProfomalistViewModel具有對當前所選Project的引用,這些模型的所有數據管理(加載和保存形式列表)是通過DI加載的經理類完成的。
我的問題是,我應該遵循我所看到的並擁有一個包含形式列表的ProjectViewModel,以及一個包含貨件和有序項目列表等的ProformaViewModel。
原因是,最初我們沒有鏈接的模型,項目沒有一個形式列表,而是通過使用所選項目ID(使用關系數據庫)的管理器單獨加載,我們正在改變我上面描述的系統的模型。
視圖模型應該是特定功能區域的用戶交互的模型
例如,如果您有一個項目列表頁面,並且用戶可以執行某些操作,例如刪除項目 , 編輯項目 , 打印有關項目的信息,那么您應該設計一個包含與此接口關聯的數據和操作的視圖模型:
例如,viewmodel應該包含:
* A bindable container for the project data (list of projects)
* Actions that handle edit/delete interaction
* An action to handle the print functionality
這些操作中的實際功能可能不包含在viewmodel中(VM可能已接收注入的服務,例如打印服務或項目存儲庫),但執行這些操作的責任在於VM。
可能還需要將每個數據項(項目)包裝在視圖模型中,以便可以添加其他依賴於交互的屬性/操作 - 例如“選定”屬性(想象用戶想要多選一個項目的負載) view - 你可以將一個選定的屬性添加到ProjectViewModel,它將包裝每個項目,使綁定變得容易)
您最終可能會遇到以下情況:
public class ProjectOverviewViewModel
{
public IList<ProjectViewModel> Projects { get;set; }
public ProjectViewModel SelectedProject { get;set;}
public void EditSelected()
{
// Code to open edit page for the selected project
}
public void Print()
{
}
}
和具有可選屬性的ProjectViewModel
public class ProjectViewModel
{
// Either put the actual data item in here and wrap it:
public Project Project {get;set;}
// Or copy properties onto the viewmodel using automapper or some other mapping framework...
// or manually :(
// e.g. properties mirrored from the entity object:
public int ProjectId { get;set;}
public string ProjectName { get;set;}
// The selected property - now your 'Selected' logic is a function of the view/viewmodel
// not the entity. The entity should only be concerned with data persistence
public bool IsSelected {get;set;}
}
您可能還希望將視圖模型合成在一起以構建更復雜的視圖。 想象一下,你有一個項目頁面和一個“參與項目的用戶”頁面,你想要另一個並排顯示的頁面(並允許你點擊一個可以刷新用戶窗格的項目) - 這可以通過合成viewmodels(通過創建另一個viewmodel,它包含兩個視圖模型作為屬性並連接兩者之間的交互)
public class ProjectAndUserOverView
{
public ProjectOverviewViewModel ProjectOverview {get;set;}
public ProjectUsersViewModel ProjectUsers {get;set;}
// Code here to listen for property changes in ProjectOverview and if SelectedProject changes
// call ProjectUsersViewModel to refresh the data for the selected user
}
最終,您只是對用戶交互進行建模,並且您可以實現模塊化程度越高,就越容易制作更清晰,更易於維護的代碼
有一些很好的MVVM框架 - 我個人最喜歡的是Caliburn Micro,因為它使上述非常容易(默認情況下大量使用約定)並且很容易進入。
MVVM是設計模式,有3個部分:Model,ViewModel,View。 DIagram看起來像這樣:
http://en.wikipedia.org/wiki/Model_View_ViewModel#Pattern_description
你使用ViewModels是錯誤的。 只有用於顯示的數據應該在ViewModel中。 您的模型例如:
public class Project
{
public Proforma Pr{get;set;}
}
public class Proforma
{
public string Name{get; set;};
}
你有View for project顯示(我將ViewModel注入構造函數,tou可以使用DataContext代替):
public partial class ProjectView
{
private ProjectViewModel vm;
public ProjectView(ProjectViewModel vm)
{
this.vm = vm;
}
}
如果要在“項目”視圖中顯示形式名稱,則應在ViewModel中將其作為字符串提供。 公共類ProjectViewModel {private Project pr; public string ProformaName {get {return pr.Pr.Name;}}}
如果您提供形式類似的形式,您的視圖將了解模型。 這將違反該模式。
我的五分錢是MVVM是一種模式,而不是宗教。 我一直使用它,因為它有意義。 有很多部分MVVM未定義(比如命令中的用戶交互),我讀了很多關於ViewModels的創建,只是為了適應MVVM(它增加了設計和對象的數量)。 我建議你更多地考慮DataContext,比如“全局感興趣的選擇保存在全局DataContext中,Proforma相關數據保存在Proforma DataContext中”等等,其中DataContext是某種ViewModel。 最后,你可能最終會用UI來操縱那些。
您不應為模型對象創建ViewModel。 一般來說,ViewModel應該屬於UserControl。 它的作用是將您的視圖(您的XAML)與您的模型(業務邏輯)連接在一起。
在您的情況下,如果我理解正確,您有一堆實現業務邏輯的類(項目,發貨等)。 您的ViewModel將具有對業務邏輯的訪問權限,並為您要綁定的視圖提供屬性。
我沒有看到包含模型數據對象的視圖模型有任何問題。 Viewmodels不必是“每個視圖一個”。 它們可以表示列表中的行或其他任何內容。
話雖如此,我很高興直接綁定到模型對象,我做了很多。 我創建一個視圖模型來包裝它的唯一一次是我需要視圖所需的每個對象的額外狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.