【问题标题】:WPF: navigating between user controls resets viewmodelWPF:在用户控件之间导航重置视图模型
【发布时间】:2019-08-08 16:09:07
【问题描述】:

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

导航可以正常工作,但是当我在文本框中输入文本,然后导航离开然后返回时,用户输入的文本会重置为其默认绑定。

我已经尝试更新源触发器并将模式设置为双向。我的“页面”有一个绑定到的视图模型,否则可以工作。

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

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!";

我希望在导航离开然后返回页面时保留输入的值。我认为这是因为当我离开我的用户控件时,我正在卸载它,而当我返回时,我得到了一个新的视图模型实例。我只是不知道如何在内存中保留一个。

【问题讨论】:

    标签: c# wpf navigation viewmodel


    【解决方案1】:

    您应该发布更多代码,从碎片中不清楚。

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

    public static MyPageViewModel Instance => new MyPageViewModel();
    

    这会在你的视图每次访问时生成一个新的 ViewModel,因为它相当于写:

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

    相反,你应该写类似

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

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

    【讨论】:

      【解决方案2】:

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

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

      它奏效了。

      【讨论】:

      • 不客气!在 Stack Overflow 上,您应该将我的答案标记为正确(左侧的检查),因此无需编写新答案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多