MVVM从视图读取数据到模型

本文关键字:模型 数据 读取 视图 MVVM | 更新日期: 2023-09-27 18:27:32

我想将用户输入数据从视图(例如,用于查询日期、名称等数据的筛选条件)读取到视图模型。为此,我在视图模型和视图元素(即本例中的文本框)之间使用了双向绑定。当视图模型分配如下时,视图将自动加载:

<DataTemplate x:Shared="False" DataType="{x:Type vm:MyViewModel}">
    <view:MyView/>
</DataTemplate>

如果视图是第一次加载的,那么一切都很好。但如果用户重新加载视图,则只创建视图模型并重用视图(正如您所看到的,我已经设置了x:Shared="False")。在这种情况下,新创建的视图模型上的所有用户输入(例如,过滤标准)都将丢失。你能告诉我解决这个问题的合适方法是什么吗?

MVVM从视图读取数据到模型

不要重新创建ViewModels,而是在第一次创建后对每个ViewModels进行静态引用。您可以利用例如MVVM Light来帮助实现这一点。

示例:

namespace SomeNamespace.ViewModel
{
    // This class contains static references to all the view models 
    // in the application and provides an entry point for the bindings.
    public class ViewModelLocator
    {
        static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
            SimpleIoc.Default.Register<LoginViewModel>();
        }
        // Reference to your viewmodel    
        public LoginViewModel LoginVM 
        { 
            get { return ServiceLocator.Current.GetInstance<LoginViewModel>(); } 
        }
        ...
    }
    ...
}

其中ViewModelLocator在App.xaml中定义为

<Application.Resources>
    <vm:ViewModelLocator xmlns:vm="clr-namespace:SomeNamespace.ViewModel" 
                         x:Key="Locator" d:IsDataSource="True" />

并且在视图中将DataContext绑定到Locators属性。

<phone:PhoneApplicationPage
    x:Class="SomeNamespace.View.LoginPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    DataContext="{Binding Source={StaticResource Locator}, Path=LoginVM}">
    ...
</phone:PhoneApplicationPage>