我有一个WPF应用程序,可以从数据源加载数据。
在加载某些数据之前,无需显示任何内容。
我的问题是:
答案 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 - 这不仅仅是建议,而是必需的。