创建ViewModel:在模型数据可用之前或之后执行此操作?

时间:2010-04-22 07:37:53

标签: wpf mvvm

我有一个WPF应用程序,可以从数据源加载数据。

在加载某些数据之前,无需显示任何内容。

我的问题是:

  • 在任何数据可用之前创建V和VM;设置一旦可用的VM中的数据
  • 一开始只创建一个V;等到数据可用然后创建注入数据的VM
  • 仅在数据可用时创建V和VM

4 个答案:

答案 0 :(得分:8)

我说在任何数据可用之前创建V和VM;一旦可用,就在VM中设置数据。

在加载数据之前显示IsLoading指示符并在单独的线程上加载数据。否则,如果数据需要一段时间才能加载,你将获得可怕的wpf黑屏。

如果视图立即加载,即使您必须等待数据加载,感觉会更好,但感觉更快。

答案 1 :(得分:4)

我所做的是立即创建我的VM和View,并显示View。

与许多应用程序一样,我的大多数模型都需要时间来启动,除了“启动状态”枚举,它立即可用,在启动期间不断更新,发送到VM,然后到我的进度条视图。

我的虚拟机订阅模型中的事件,这些事件会在发生时推送到虚拟机。在View XAML中,我为每个VM属性数据绑定到VM。

通过这种方式,用户可以获得通知。

答案 2 :(得分:2)

我已经采纳了Josh Smith在MSDN上的文章中所做的事情here...如果将视图应用于ViewModel,请向下滚动。在执行此操作时,将在呈现ViewModel时创建视图。无需手动创建视图,然后再将DataContext分配给ViewModel。这会自动为您完成。

  

“您可以通过使用类型化的DataTemplates轻松告诉WPF如何呈现ViewModel对象。类型化的DataTemplate没有分配给它的x:Key值,但它的DataType属性设置为Type类的实例如果WPF尝试呈现一个ViewModel对象,它将检查资源系统是否在作用域中具有类型化的DataTemplate,其DataType与ViewModel对象类型(或基类)相同。如果找到一,它使用该模板来呈现选项卡项的Content属性引用的ViewModel对象。“

换句话说,您可以像这样创建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>

答案 3 :(得分:1)

仅创建没有viewModel的View是IMO没有意义的 - 来自View的所有绑定属性怎么样?由于没有ViewModel,因此没有任何限制。你没有看到任何例外的事实并不意味着一切都好:)

当然,您应该在一开始就为所有视图(当然使用的视图:))实例化您的ViewModel - 这不仅仅是建议,而是必需的。