创建ViewModel:在模型数据可用之前或之后执行此操作?
我有一个从数据源加载数据的WPF应用程序。创建ViewModel:在模型数据可用之前或之后执行此操作?
在加载某些数据之前,不会显示任何内容。
我的问题是我:
- 创建V和VM可用之前的任何数据;设置VM中的数据一旦可用
- 在开始时只创建V;等到现有的数据,然后创建VM注入数据
- 创建V和VM只有一次的可用数据
我说创建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