0

为了提供一些上下文,我正在编写一个 Xamarin.Forms 应用程序并利用 INotifyPropertyChanged 进行数据绑定。目前,我在按钮上显示了一个库存计数器。此按钮上的文本显示有界的“计数”变量(例如,当前库存:35)。当我按下按钮时,我将一个屏幕推送到导航堆栈上,它允许我编辑这个“计数”变量。我使用这样的类实现

 public class UserInventory : INotifyPropertyChanged
{
    private int count = 0;

    // Declare the event
    public event PropertyChangedEventHandler PropertyChanged;

    public int Count
    {
        get => Preferences.Get(nameof(Count),0);
        set
        {

            if (count == value || value <1)
                return;
            Preferences.Set(nameof(Count), value);
            //count = value;
            //Application.Current.Properties["Count"] = count;
            OnPropertyChanged(nameof(Count));
            //OnPropertyChanged(nameof(displayName));
        }
    }



    public UserInventory()
    {

    }


    void OnPropertyChanged(string count)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(count));
    }
}

我根据 Xamarin 上的教程在 Xaml 中添加了这个类<ContentPage.BindingContext> <local:UserInventory /> </ContentPage.BindingContext> 所以变量的边界是正确的,我在当前页面上看到更新或推送新页面时没有问题。问题是当我在 iOS 上滑动前一个屏幕时,带有“当前库存:35”按钮的屏幕不会更新以反映新的变化。如果我按下该屏幕,则会反映更改。

无论如何,当您返回 (PopAsync()) 时,是否可以确保更新有界数据?

4

1 回答 1

0

Try overriding page's OnAppearing() method and call OnPropertyChanged from there.

Assuming 'UserInventory' the binded VM.....

public partial class Page1:ContentPage
{
  public Page1()
  {
    InitializeComponent();
    VM = (UserInventory)BindingContext;
  }

  public UserInventory VM { get; }

  protected override void OnAppearing()
  {
    VM.Notify();
    base.OnAppearing();
  }
}

.

public class UserInventory: INotifyPropertyChanged
{
  ........

  public void Notify()
  {
    OnPropertyChanged(nameof(Count));
  }
}
于 2020-05-25T02:22:43.047 回答