我不確定這是創建合成視圖的標準方式,但我已經成功定義了一個主視圖(在我的情況下爲Window
),其中包含視圖系列所需的常用控件,通過使用ContentControl
作爲等價於ASP.NET主頁面中的ContentPlaceholder
的方式,爲每個不同的子視圖注入不同的UserControl
到主文件夾中。就我而言,我已經定義的所有子視圖實現一個接口:
public interface ISubView
{
BaseViewModel ViewModel { get; set; }
}
這讓我ApplicationController
來處理,以顯示特定視圖的請求時,視圖模型推到子視圖。在顯示之前,通過主視圖上的setter屬性將子視圖與主視圖合成。
ApplicationController
是集中開啓和關閉視圖任務的類;只要應用程序中的任何內容想要顯示特定視圖,就會詢問ApplicationController
。當它接收到顯示特定視圖的請求時,它會查找並從內部「註冊表」中構造相應的子視圖和View Model子類,並將這些部分組合在一起。在應用程序啓動時,您創建ApplicationController
並註冊ViewModel子類和View子類的組合。部分示例實現是:
public class ApplicationController
{
private IDictionary<string, Tuple<Func<ISubView>, Func<BaseViewModel>> _registry;
private Func<IShellWindow> _shellActivator;
public ApplicationController(Func<IShellWindow> shellActivator)
{
_registry = new Dictionary<string, Tuple<Func<ISubView>, Func<BaseViewModel>>();
_shellActivator = shellActivator;
}
public void RequestShow(string viewName)
{
var shell = _shellActivator();
var viewToModel = _registry[viewName];
var view = viewToModel.Item1();
var viewModel = viewToModel.Item2();
view.ViewModel = viewModel;
shell.Display(view);
}
public Register(string name, Func<ISubView> subViewCreator, Func<ViewModel> viewModelCreator)
{
_registry.Add(name, new Tuple(subViewCreator, viewModelCreator));
}
}
在外殼的Display
方法(IShellView接口上定義),你會做這樣的事情:
public void Display(ISubView view)
{
contentHolder.Content = view;
DataContext = view.ViewModel;
Show();
}
的應用程序啓動將包括類似:
var appController = new ApplicationController(() => new ShellWindow());
appController.Register("EmployeesReport",() => new EmployeesReportView(),() => new EmployeesReportViewModel);
appController.Register("OrdersReport",() => new OrdersReportView(),() => new OrdersReportViewModel());
//etc.
CAF GUI或PRISM使用這個主區域和本地區域的概念不是他們?你不能使用它? –
我不使用這些框架,所以我不認爲我可以利用這個概念。 –