MVVM从视图到模型读取数据

时间:2014-10-22 05:25:12

标签: c# wpf mvvm binding

我想从视图中读取用户输入数据(例如,查询数据的过滤条件,例如日期,名称等)到viewmodel。为此,我使用了viewmodel和view元素之间的双向绑定(在本例中是textbox)。分配视图模型时,将自动加载视图,如下所示:

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

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

1 个答案:

答案 0 :(得分:2)

不要重新创建ViewModels,而是在第一次创建ViewModel之后对它们进行静态引用。你可以利用例如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>