如何在WPF应用程序中捆绑View,ViewModel和DataTemplate以便于重用?
情况:
我想创建一个由ViewModel驱动的灵活应用程序。
基本流程如下:
- 设计主ViewModel
- 创建UserControl作为View,并为主ViewModel创建DataTemplate以选择此View
- 如果有子组件,则由子ViewModel建模
- 创建UserControl作为View,并为子ViewModel创建DataTemplate以选择此View
如果需要显示子视图模型,则通过DataTemplate完成。
这种方法也可以在这里看到(选项8)。
所以主窗口xaml看起来像这样:
Content
属性可能包含一个视图模型,其中包含名为Children
的元素列表,并且它的关联DataTemplate可能如下所示:子项也由合适的DataTemplate灵活地呈现。
题:
-
我应该如何组织ViewModel,Views及其DataTemplates,以便我不需要在MainWindow中对它们进行硬连线?
-
如何将其连接到主窗口?
-
如果它是可存储的,那将是很好的,即我可以在设计时使用设计时dataContext查看结果。
基本上我想捆绑View,ViewModel和DataTemplate,并且能够在不需要了解细节的应用程序中使用它们(例如,一些子ViewModel实现某个接口并注入到主ViewModel中)。
你看过Prism吗?
该框架允许您在UI中定义可以注册视图的区域。 我相信这回答了你的第二个问题(2)。
xmlns:cal="http://www.codeplex.com/prism"
对于您的第一个问题(1),我们按以下方式构建实体:
视图 – 我们有一个看起来相似的抽象基类:
public abstract class ViewBase : UserControl, IView where T: IViewModel { public T ViewModel { get { return this.viewModel; } protected set { this.viewModel = value; this.DataContext = this.viewModel; } } public ViewBase(IUnityContainer container) { this.ViewModel = container.Resolve (); } }
然后,这允许我们使用以下方法在xaml中创建视图:
在View背后的代码中,我们执行以下操作:
public partial class MyView : ViewBase
然后,它使用基类中的构造函数来解析ViewModel并将其设置为它的DataContext。
然后,您可以按预期设计视图(3),并且无需使用DataTemplate。
然后使用UnityContainer注册视图,如下所示:
this.container.RegisterType(); this.container.RegisterType(); this.regionManager.RegisterViewWithRegion("MainRegion", typeof(IMyView));
请注意,此处的“MainRegion”与MainWindow xaml中指定的RegionName匹配。 如果要在同一区域中显示多个视图,或者甚至将MainWindow分解为不同的区域,可以进一步扩展以使用TabControl。
我希望这有帮助。
1)您可以在每个视图中添加UserControl.Resources中的DataTemplates,即
现在您为每个ViewModel定义了相应的View。 您只为该视图中的ViewModel添加了数据模板,即子视图模型
2)嗯,你的MainWindow也必须有一个ViewModel,即在MainWindow DataContext中放入一个MainWindows的ViewModel实例。 ViewModel必须包含属性Content(在其中放置ViewModel作为内容)。 您可以在App.xaml.cs中手动执行此操作
public partial class App : Application { public App() { this.Startup += App_Startup; } public void App_Startup(object sender, StartupEventArgs e) { this.MainWindow = new MainWindow(); //create view model and set data context MainWindowViewModel vm = new MainWindowViewModel(); this.MainWindow.DataContext = vm; //show window this.MainWindow.ShowDialog(vm); } }
3)我不确定这一点,你可能无法在设计时看到结果。
我不确定我是否完全理解你想要什么,如果这没有帮助,请重播这个答案,并进一步解释。
- 如何在C#/ VisualStudio 2008中导出代码文档?
- MVVM:在跟踪IsSynchronizedWithCurrentItem时绑定到List IsSelected
- 用Linq查询替换for-switch循环
- C#:System.Reflection.MethodInfo原因:(对象与目标类型不匹配)
- Visual Studio – 用资源替换硬编码字符串的工具
- Visual Studio设计器中的抽象UserControlinheritance
- 如何将存储在HSM中的私钥转换为C#中的SignedXml.SigningKey
- 如何更新LINQ中的单个列而不加载整行?
- 使用LINQ to XML时如何检查XML是否包含元素?