web-dev-qa-db-fra.com

Comment lier une propriété de contrôle WPF en lecture seule (par exemple réelwidth), sa valeur est donc accessible dans le modèle de vue?

Je veux lier une propriété en lecture seule d'un contrôle sur mon modèle de vue afin que la valeur soit disponible dans le modèle de vue.

Quelle est la meilleure façon de faire ça?

Par exemple, je voudrais lier ActualWidth à une propriété dans mon modèle de vue. La valeur de la largeur est générée par WPF à l'aide de sa logique de présentation afin que je ne puisse pas générer cette valeur dans mon modèle de vue et le pousser à la propriété de contrôle, comme cela serait normalement le cas. Au lieu de cela, j'ai besoin d'avoir WPF générer la valeur et de le pousser au modèle de vue.

Je voudrais juste utiliser Mode=OneWayToSource, mais cela ne fonctionne pas pour des propriétés en lecture seule:

  <Border
      ...
      ActualWidth="{Binding MyDataModelWidth, Mode=OneWayToSource}"
      >
      ... child controls ...
  </Border>

La façon dont je le fais est actuellement consiste à gérer SizeChanged pour la frontière et le code-derrière branche la valeur dans le modèle de vue, mais cela ne se sent pas parfaitement correct.

Quelqu'un a-t-il déjà résolu ce problème?

MISE À JOUR: Ma question est efficace d'un duplicata de celui-ci: repousser les propriétés de l'interface graphique en lecture seule dans la fenêtre

23
Ashley Davis

Le problème réel de la raison pour laquelle cela ne fonctionne pas est décrit ICI .

Cependant, la solution donnée pour créer un setter de lancer pour réussir la validation ne fonctionnerait pas dans votre cas.

Je pense que c'est correct d'appeler une méthode sur la viewModel. Si c'est le code de la partie qui vous informe, vous pouvez peut-être utiliser une interactivité pour appeler une méthode basée sur un déclencheur d'événement (Sizechanged).

1
sowee15

avez-vous vraiment besoin d'une liaison pour cela?

    class MyVM
    {
        FrameworkElement _context;

        public MyVM(FrameworkElement context)
        {
            _context = context;
        }

        public double Width
        {
            get { return _context.ActualWidth; }
        }
    }
0
Grozz