2009-04-06 17 views
4

Ich habe eine Frage in Bezug auf WPF Bindung und Konvertierung der Datentypen von den UI-Objekten in XAML gesehen.WPF-Datenbindung und Typkonvertierung

Ich habe eine Benutzerkontrolle, die ich in verschiedenen Anwendungen wiederverwenden möchte. Das Benutzersteuerelement zeigt ein Miniaturbild und mehrere TextBlocks an, um demografische Informationen wie Name und Adresse anzuzeigen. Das Benutzersteuerelement wird in einem MVVM-Design verwendet, daher ist es an ein ViewModel gebunden, das für das Benutzersteuerelement spezifisch ist.

Gemäß den typischen MVVM-Entwurfsprinzipien ist das ViewModel für das Benutzersteuerelement häufig in andere ViewModels eingebettet, um eine größere Benutzeroberfläche zu erstellen.

Das Benutzersteuerungsansichtsmodell erwartet einen bestimmten Typ (Klasse) als sein Bindungsobjekt. Die ViewModels, in denen die eingebettete UC-VM jedoch über völlig unterschiedliche Objektmodelle verfügt, können ihre Daten nicht einfach an die UC-VM übergeben. Es muss eine Konvertierung des Datenmodells der übergeordneten VM in das Datenmodell der UC VM erfolgen.

Meine Frage ist dies: Gibt es eine sanktionierte Möglichkeit, diese Konvertierung durchzuführen?

Ich schaute auf IValueConverter und IMultiValueConverter und diese sehen nicht wie der Weg zu gehen.

Ich denke, was ich brauche, ist eine Art Shim zwischen der übergeordneten VM und der eingebetteten UC VM, wo die Daten der übergeordneten VM in das von der UC VM benötigte Format konvertiert werden.

Oder kommt es im Grunde darauf an, dass ich eine benutzerdefinierte UC VM schreiben muss, um mit den von der übergeordneten VM bereitgestellten Typen umgehen zu können?

+0

Was meinen Sie, wenn Sie den Begriff Benutzersteuerungsansichtsmodell verwenden? Das Ansichtsmodell, das vom betreffenden Benutzersteuerelement verwendet wird? –

Antwort

1

Wenn die übergeordnete VM eine Obermenge der untergeordneten VM ist, enthält die übergeordnete VM normalerweise nur einen Verweis auf die untergeordnete VM. Es würde diese Referenz als eine Eigenschaft verfügbar machen, und Sie würden eine ContentControl (oder was auch immer) an diese Eigenschaft binden.

Würde dies Ihr Problem nicht lösen?

+0

Danke, das würde funktionieren, wenn die übergeordnete VM Daten im nativen Format der UC VM liefert. Mit anderen Worten: Ja, die übergeordnete VM ist eine Obermenge der untergeordneten VM, aber die Daten haben ein völlig anderes Format. Ich bin neu in diesem Zeug, also wirst du meine Unwissenheit vergeben müssen. – MattJ

0

Wenn Sie wirklich wollen und müssen Typumwandlungen tun, sind die Wertkonverter genau das, was Sie verwenden möchten. Das heißt, typischerweise ist die Art von Conversions, die von Dingen wie IValueConverter gehandhabt werden, relativ einfach und direkt.

Wenn Ihr Benutzersteuerelement Top-Level/Parent/Management jedoch Bits und Teile eines größeren Typs an die Benutzersteuerelemente analysieren muss, die den eigentlichen Inhalt hosten, ist dies die Aufgabe dieses Toplevel-Steuerelements. Machen Sie sich in XAML nicht alles einfallen lassen. Es ist völlig in Ordnung, das, was Sie benötigen, zu analysieren und diese untergeordneten Steuereigenschaften direkt festzulegen.

2

Ich stimme Ken, ich denke, er hat die Antwort. Wenn Sie viele Konfigurationen Ihrer Daten haben, die Sie an ein gemeinsames Benutzersteuerelement übergeben möchten, möchten Sie, dass der Besitzer dieser Datenkonfiguration diese in ein allgemeines Formular konvertiert, das an das Benutzersteuerelement gebunden wird.

Jede Ansicht, die die Steuerung verwendet ein entsprechende Ansicht Modell haben würde, das eine Eigenschaft in einem gemeinsamen Format aussetzt:

public class SampleViewModel { 
    ... 

    IUserControlData ControlData 
    { 
     get 
     { 
      // Do conversion here or do it early and cache it. 
     } 
    } 

    ... 
} 

Dann würden binden Sie diese Eigenschaft zu Ihrer Benutzersteuerung in der Ansicht

<common:CommonUserControl DataContext={Binding Path=ControlData} ... > 
Verwandte Themen