gpt4 book ai didi

c# - Navigation Back & MVVM - 如何刷新 WP8 页面数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 20:30:04 24 4
gpt4 key购买 nike

我正在开发 WP8 应用程序 (C#/XAML)。

在我看来,我指定了一个按钮,该按钮通过与回调绑定(bind)来设置,用于在 VM 未完全加载时启动应用程序。

MVVM 看起来像:

ViewModel
---------
+ Model
-----
+Property

并且是在 App.xaml.cs 中创建的,如下所示:

public static MainViewModel ViewModel
{
get
{
if (viewModel == null)
{
viewModel = new MainViewModel();
}
return viewModel;
}
}

并在页面的构造函数中将页面设置为数据上下文:

DataContext = App.ViewModel;

和按钮:

<Button x:Name="btn" Content="{Binding Model.Property, FallBackValue='click to load'}" .../>
  • 一开始,btn 没有值可以放入它的内容,因为模型是空的。

  • 单击 btn 时,它会加载模型。它用数据填充模型并导航到显示该数据的另一个页面。

  • 当我向后导航(通过硬件后退按钮)时,我希望 btn 使用绑定(bind)的值而不是回退,因为该值已经设置。但它不使用它,仍然使用绑定(bind)的 FallbackValue 参数提供的那个。

如何确保页面“刷新”并使用 ViewModel 提供的实际值?

最佳答案

啊,好的,我自己找到了解决问题的方法。

问题

如果您使用的是静态 Datacontext(如果您使用的 Viewmodel 类是静态创建的),那么当您导航回该页面时,数据绑定(bind)将不会更新(至少我的情况是这样) .

我对多个页面使用相同的数据上下文(ViewModel 包含多个模型以及一些集合和属性)。但是当我通过硬件后退按钮导航回页面时,数据绑定(bind)没有更新。

按钮/文本 block 的内容停留在旧值,即使您将其更改为一些新值也是如此。

解决方案

覆盖 OnNavigatedTo 方法,并在构造函数中设置数据绑定(bind)。这样您就可以确定数据绑定(bind)始终是“新鲜的”和更新的。

在代码隐藏的 page 类中(.xaml.cs 文件粘贴到您的 .xaml 页面)写这个:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e); //can be left out, base method is empty
DataContext = null; //setting datacontext empty at first
DataContext = App.ViewModel; //and setting it to the static ViewModel i created
}

这样,当我来到页面时,DataContext 总是首先设置为 null(这样旧值就干净了,没有什么可以绑定(bind)的) .

在那之后不久,我将原来的 DataContext 放回原来的位置,因此它有一些东西可以再次绑定(bind)。

null 的步骤是必要的,因为我需要更改 datacontext 属性,否则如果我再次指向已设置为 dataContext 的同一个对象,则不会发生任何事情。

关于c# - Navigation Back & MVVM - 如何刷新 WP8 页面数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19442961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com