我想从视图中读取用户输入数据(例如,查询数据的过滤条件,例如日期,名称等)到viewmodel。为此,我使用了viewmodel和view元素之间的双向绑定(在本例中是textbox)。分配视图模型时,将自动加载视图,如下所示:
<DataTemplate x:Shared="False" DataType="{x:Type vm:MyViewModel}">
<view:MyView/>
</DataTemplate>
如果第一次加载视图,那么每件事都很好。但是如果用户重新加载视图,那么只创建viewmodel并重新使用视图(我已经设置了x:Shared =“False”)。在这种情况下,所有用户输入(例如过滤标准)在新创建的视图模型上丢失。能告诉我解决这个问题的合适方法吗?
答案 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>