2010-12-14 6 views
20

Ich möchte eine schreibgeschützte Eigenschaft eines Steuerelements an mein Ansichtsmodell binden, damit der Wert im Ansichtsmodell verfügbar ist.Wie binden Sie eine schreibgeschützte WPF-Steuereigenschaft (z. B. ActualWidth), sodass der Wert im Ansichtsmodell verfügbar ist?

Was ist der beste Weg, dies zu tun?

Zum Beispiel möchte ich ActualWidth an eine Eigenschaft in meinem Ansichtsmodell binden. Der Wert für die Breite wird von WPF mithilfe seiner Layout-Logik generiert, sodass ich diesen Wert nicht in meinem Ansichtsmodell generieren und wie gewöhnlich auf die Eigenschaft control übertragen kann. Stattdessen muss WPF den Wert generieren und an das Ansichtsmodell senden.

Ich würde nur Mode=OneWayToSource verwenden, aber das funktioniert nicht für Nur-Lese-Eigenschaften:

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

So wie ich es derzeit tue, ist SizeChanged für die Grenze und die Handhabung Code-Behind-Stecker des Wert in das Ansichtsmodell, aber das fühlt sich nicht ganz richtig an.

Hat schon jemand dieses Problem gelöst?

UPDATE: Meine Frage ist tatsächlich ein Duplikat dieser: Pushing read-only GUI properties back into ViewModel

Antwort

9
+0

genial. beide fast zur gleichen Zeit, mit demselben Link. Haha! – Nawaz

+0

Der zweite Link ist eine nette wiederverwendbare Lösung, deren Basis Sie verwenden (mit dem SizeChanged-Ereignis). – sowee15

+3

Könnten Sie bitte den Kern des in die Antwort einfügen, sollte eine Antwort auf StackOverflow nicht nur Links enthalten ... –

0

brauchen Sie wirklich ein für die Bindung?

class MyVM 
    { 
     FrameworkElement _context; 

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

     public double Width 
     { 
      get { return _context.ActualWidth; } 
     } 
    } 
+1

Es ist eine interessante Idee, aber die UI-Objekte werden von den View-Model-Objekten generiert, so dass ich das FrameworkElement nicht über den Konstruktor übergeben konnte. Ich nehme an, ich könnte das View-Model-Objekt später an das FrameworkElement binden, aber das klingt, als würde es gegen ein WPF-Prinzip verstoßen (ich könnte es trotzdem verletzen, aber zumindest in meiner aktuellen Implementierung greift das View-Modell nicht explizit auf die UI zu). –

1

Das eigentliche Problem, warum ist dies nicht here beschrieben arbeiten.

Die angegebene Lösung zum Erstellen eines Wurfsetzers zum Übergeben der Validierung würde in Ihrem Fall jedoch nicht funktionieren.

Ich denke, es ist in Ordnung, eine Methode auf dem ViewModel aufzurufen. Wenn dies der Code hinter dem Teil ist, der Sie stört, können Sie vielleicht Interaktivität verwenden, um eine Methode aufzurufen, die auf einem Ereignisauslöser (SizeChanged) basiert.