2 votes

Notification de toutes les propriétés du modèle de vue a changé avec null ou chaîne vide

Je viens du développement de solutions WPF où la mise à jour de toutes les propriétés du viewmodel était aussi simple que :

OnPropertyChanged(String.Empty);

Dans le scénario de la plate-forme Windows universelle, j'ai simplement la même méthode pour mettre à jour/rafraîchir les propriétés. Cela fonctionne bien dans la plupart des cas, mais parfois, une erreur se produit, comme celle-ci :

COMException Error HRESULT E_FAIL a été renvoyé par un appel à un composant COM. at System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e) at GeekyTool.Base.BindableBase. OnPropertyChanged(String propertyName) at Pooo.set_Root(UserRoot value) at Booo.d__26.MoveNext() --- Fin de la trace de pile de l'emplacement précédent où l'exception a été levée --- at System.Runtime.CompilerServices. TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at GeekyTool.Base.PageBase.d__1. MoveNext() --- Fin de la trace de pile de l'emplacement précédent où l'exception a été levée --- at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state) at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()

En OnPropertyChanged avec une méthode INotifyPropertyChanged L'implémentation de l'interface ressemble à ceci :

public abstract class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public virtual bool Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
    {
        if (object.Equals(storage, value))
            return false;
        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }
}

Vous pouvez explorer la bibliothèque mvvm, mais rien de différent sur l'implémentation INotifyPropertyChanged.

Bibliothèque GeekyTool sur Github

2voto

Pedro Lamas Points 5600

Je vois sur la trace de la pile qu'il y a du code asynchrone, donc je suggère d'invoquer seulement OnPropertyChanged(String.Empty) con el Dispatcher comme ça :

Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    OnPropertyChanged(string.Empty);
});

2voto

soydachi Points 619

Merci pour toutes les réponses, j'essayais de corriger une erreur qui n'existait pas.

Dans la méthode OnPropertyChanged(string.Empty) lever l'erreur parce qu'il vient avec un problème de contexte sync de la page précédente.

Cela se produit lorsque vous naviguez très rapidement entre deux pages et qu'il y a des appels asynchrones dans la méthode OnNavigatedTo qui ne sont pas encore terminés. Les méthodes asynchrones sont attendues, mais dans cette page, il n'a pas été géré que l'utilisateur attende jusqu'à ce que ce soit terminé.

Juste pour savoir qu'il n'est pas nécessaire d'appliquer la correction de @PedroLamas. S'assurer sur la page précédente que tous les appels asynchrones sont terminés, c'est fait.

1voto

Hermit Dave Points 2906

CallerMemeberName tire le nom du membre appelant si vous passez dans rien (ou null) qui n'est pas la même chaîne.empty

Je réparerais ça en premier.

public bool IsValid
{
    get { return isValid; }
    set
    {
        if (isValid == value)
        {
            return;
        }

        isValid = value;
        OnPropertyChanged();
    }
}

Cela devrait fonctionner. Souvent, lorsque je ne peux pas utiliser ReactiveObject ou ObservableObject, j'ai tendance à utiliser ceci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X