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();
它奏效了。
我有一个应用程序,我将用户控件用作应用程序的 "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();
它奏效了。