MVVM从视图读取数据到模型
本文关键字:模型 数据 读取 视图 MVVM | 更新日期: 2023-09-27 18:27:32
我想将用户输入数据从视图(例如,用于查询日期、名称等数据的筛选条件)读取到视图模型。为此,我在视图模型和视图元素(即本例中的文本框)之间使用了双向绑定。当视图模型分配如下时,视图将自动加载:
<DataTemplate x:Shared="False" DataType="{x:Type vm:MyViewModel}">
<view:MyView/>
</DataTemplate>
如果视图是第一次加载的,那么一切都很好。但如果用户重新加载视图,则只创建视图模型并重用视图(正如您所看到的,我已经设置了x:Shared="False")。在这种情况下,新创建的视图模型上的所有用户输入(例如,过滤标准)都将丢失。你能告诉我解决这个问题的合适方法是什么吗?
不要重新创建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>