2010-12-14 60 views
20

Je veux lier une propriété en lecture seule d'un contrôle à mon modèle de vue afin que la valeur soit disponible dans le modèle de vue.Comment lier une propriété de contrôle WPF en lecture seule (par exemple ActualWidth) afin que sa valeur soit accessible dans le modèle de vue?

Quelle est la meilleure façon de procéder?

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

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

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

La façon dont je le fais est actuellement gérer SizeChanged pour la frontière et le code-behind bouchons du valeur dans le modèle de vue, mais cela ne semble pas tout à fait raison.

Est-ce que quelqu'un a déjà résolu ce problème?

MISE À JOUR: Ma question est en fait un double de celui-ci: Pushing read-only GUI properties back into ViewModel

Répondre

9
+0

génial. les deux à peu près en même temps, avec le même lien. haha! – Nawaz

+0

Le deuxième lien est une bonne solution réutilisable dont la base est ce que vous faites (en utilisant l'événement SizeChanged). – sowee15

+3

Pourriez-vous s'il vous plaît inclure l'essentiel de la réponse, une réponse sur StackOverflow ne devrait pas seulement contenir des liens ... –

0

-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; } 
     } 
    } 
+1

C'est une idée intéressante, mais les objets de l'interface utilisateur sont générés à partir des objets du modèle de vue, donc je ne pouvais pas passer dans le FrameworkElement via le constructeur. Je suppose que je pourrais lier l'objet de modèle de vue à FrameworkElement plus tard, mais cela semble violer un principe WPF (je le viole de toute façon mais au moins dans ma mise en œuvre actuelle, le modèle de vue n'accède pas explicitement à l'interface utilisateur). –

1

Le problème réel pourquoi cela ne fonctionne pas est décrit here. Cependant, la solution donnée pour créer un setter de lancer pour passer la validation ne fonctionnerait pas dans votre cas.

Je pense que c'est correct d'appeler une méthode sur le ViewModel. Si c'est le code derrière la partie qui vous dérange, vous pouvez peut-être utiliser l'interactivité pour appeler une méthode basée sur un déclencheur d'événement (SizeChanged).