WPF:在用户控件之间导航会重置视图模型

WPF: navigating between user controls resets viewmodel

我有一个应用程序,我将用户控件用作应用程序的 "pages"。我在主窗口的 ApplicationViewModel 中有一个 currentpage 绑定,我通过使用附加到侧面菜单控件的命令更改 currentpage 的绑定来在页面之间导航。我正在使用 MVVM 模式,我的所有 ViewModel 都派生自 BaseViewModel class.

导航有效,但是当我在文本框中输入文本,然后导航离开然后返回时,用户输入的文本被重置为其默认绑定。

我已经尝试更新源触发器并将模式设置为 TwoWay。我的 "page" 有一个它绑定的视图模型,否则可以正常工作。

在我的页面上,父网格中的所有控件都位于:

DataContext="{x:Static core:MyPageViewModel.Instance}">

和控制:

<TextBox Text="{Binding TextBoxTest, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

在我的视图模型中:

public static MyPageViewModel Instance => new MyPageViewModel(); public string TextBoxTest { get; set; } = "Change Me!";

我希望我输入的值在我导航离开时保留,然后 return 到页面。我认为这是因为当我离开我的用户控件时,我正在卸载它,而当我返回时,我得到了一个新的视图模型实例。就是不知道怎么留着一个留在记忆里的。

你应该post更多的代码,从碎片中看不清楚。

无论如何我可以试着猜测问题出在这里:

public static MyPageViewModel Instance => new MyPageViewModel();

这会在您的视图每次访问它时生成一个新的 ViewModel,因为它等同于编写:

public static MyPageViewModel Instance { get { return new MyPageViewModel(); } }

相反,你应该这样写

public static MyPageViewModel Instance { get; } = new MyPageViewModel();

这样,第一次访问它时,它 returns 默认值 (new MyPageViewModel()),现在静态变量将始终指向相同的视图模型,而不是创建一个新的视图模型一.

Guido C. 完全正确。我将我的 viewmodel 实例从我在问题中的方式更改为:

public static MyPageViewModel Instance { get; } = new MyPageViewModel();

它奏效了。