2 votes

Problèmes de liaison WPF lors de l'utilisation de MVVM

Le temps de ma première question :)

J'ai le suivant:

public class BuilderViewModel : INotifyPropertyChanged
{
    #region Implémentation de INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    private double _contentScale = 1.0;

    public double ContentScale
    {
        get { return _contentScale; }
        set
        {
            _contentScale = value;
            NotifyPropertyChanged("ContentScale");
        }
    }

    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    } 

    #region Commands

    bool CanZoomIn() { return true; }
    void ZoomInExecute()
    {
        ContentScale += 1.0;
    }

    public ICommand ZoomIn { get { return new RelayCommand(ZoomInExecute, CanZoomIn); } }

    #endregion
}

Et la vue correspondante:

J'essaie d'avoir la commande ZoomIn dans BuilderViewModel mettre à jour la valeur de la zone de texte dans sa vue. La commande est déclenchée à partir d'un autre user control, UIBuilder, qui inclut Builder. Si je débogue et que je déclenche la commande à partir de UIBuilder, je peux voir qu'elle met à jour ContentScale correctement.

Cependant, la valeur de ma zone de texte n'est pas mise à jour (elle affiche seulement "1", qui est la valeur initiale de ContentScale).

Je sais que je manque quelque chose et j'espère que quelqu'un pourra me mettre sur la bonne voie.

EDIT: Ajout du contrôle qui déclenche la commande

        ....

                ....

1voto

nemesv Points 71516

Avec le paramétrage dans les deux vues:

vous créez essentiellement deux viewmodels, un pour chaque vue. Ainsi, lorsque votre commande met à jour la propriété, elle le fait sur l'un des viewmodels, mais votre zone de texte est liée à un viewmodel différent.

Pour résoudre cela, supprimez le paramétrage DataContext du Builder.xaml

De plus, vous devez transmettre votre DataContext à votre contrôle Builder (ainsi, les deux vues partageront le même viewmodel).

Modifiez donc votre UIBuilder.xaml:

0voto

Aghilas Yakoub Points 16682

Utilisez le mode TwoWay dans votre liaison

 Text ="{Binding ElementName=BuilderViewModel,
         Path=ContentScale,
         Mode=TwoWay,
         UpdateSourceTrigger=PropertyChanged}"

Nota : utilisez une collection observable pour envoyer des notifications

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