简体   繁体   中英

Is there a way to update bounded data when I swipe back [PopAsync() ]

To provide some context, I'm writing a Xamarin.Forms application and utilizing data binding with INotifyPropertyChanged. Currently I have an inventory counter displayed on a button. The text on this button displays the bounded "Count" variable (eg Current Inventory: 35). When I press the button, I push a screen onto the navigation stack which allows me to edit this "Count" variable. I use the class implementation like this

 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));
    }
}

I add this class in Xaml according to the tutorial on the Xamarin <ContentPage.BindingContext> <local:UserInventory /> </ContentPage.BindingContext> So the variables are bounded correctly and I have no issues seeing updates on the current page or when I push new pages. The issue is when I swipe back on iOS the previous screen with the button "Current Inventory: 35" does not update to reflect the new changes. If I push that screen the changes are reflected.

Is there anyway to ensure the bounded data is updated when you go back (PopAsync())?

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));
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM