4 Stimmen

WPF-Datenbindung und Typkonvertierung

Ich habe eine Frage in Bezug auf WPF-Bindung und Konvertierung der Datentypen durch die UI-Objekte in XAML gesehen.

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

Typischen MVVM-Designprinzipien folgend, wird das ViewModel für die Benutzerkontrolle oft in andere ViewModels eingebettet, um eine größere Benutzeroberfläche zu bilden.

Das View Model des User Controls erwartet einen bestimmten Typ (Klasse) als Bindungsobjekt. Die ViewModels, in die die UC-VM eingebettet ist, haben jedoch völlig andere Objektmodelle, so dass sie ihre Daten nicht einfach an die UC-VM weitergeben können. Es muss eine Konvertierung des Datenmodells der übergeordneten VM in das Datenmodell der UC-VM erfolgen.

Meine Frage ist folgende: Gibt es eine sanktionierte Methode, diese Umwandlung durchzuführen?

Ich habe mir IValueConverter und IMultiValueConverter angesehen, und diese sehen nicht wie der richtige Weg aus.

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

Oder läuft es im Grunde darauf hinaus, dass ich eine benutzerdefinierte UC VM schreiben muss, um alle Typen zu handhaben, die die übergeordnete VM bereitstellt?

2voto

MichaC Punkte 2804

Ich stimme Ken zu, ich glaube, er hat die Antwort. Wenn Sie n viele Konfigurationen Ihrer Daten haben, die Sie an ein gemeinsames Benutzerelement übergeben möchten, dann möchten Sie, dass der Eigentümer dieser Datenkonfiguration sie in ein gemeinsames Formular umwandelt, das an das Benutzerelement gebunden wird.

Jede Ansicht, die das Steuerelement verwendet, hätte ein entsprechendes Ansichtsmodell, das eine Eigenschaft in einem gemeinsamen Format darstellt:

public class SampleViewModel {
   ...

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

   ...
}

Dann binden Sie diese Eigenschaft an Ihr Benutzersteuerelement in der Ansicht

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

1voto

Kent Boogaart Punkte 170094

Wenn die übergeordnete VM eine Obermenge der untergeordneten VM ist, würde die übergeordnete VM normalerweise nur einen Verweis auf die untergeordnete VM enthalten. Sie würde diese Referenz als Eigenschaft offenlegen, und Sie würden eine ContentControl (oder was auch immer) zu dieser Eigenschaft.

Würde dies nicht Ihr Problem lösen?

0voto

Ken Wootton Punkte 1100

Wenn Sie wirklich Typkonvertierungen durchführen wollen und müssen, sind die Wertkonverter genau das Richtige für Sie. Das heißt, in der Regel die Art der Konvertierungen durch Dinge wie IValueConverter behandelt sind relativ einfach und direkt.

Wenn jedoch Ihr übergeordnetes/übergeordnetes/Verwaltungs-Benutzerelement Bits und Stücke eines größeren Typs an die Benutzerelemente weiterleiten muss, die den eigentlichen Inhalt hosten, dann ist das die Aufgabe dieses übergeordneten Steuerelements. Verstricken Sie sich nicht darin, dies alles in XAML zu tun. Es ist völlig in Ordnung, zu analysieren, was Sie brauchen, und setzen Sie diese Eigenschaften der untergeordneten Steuerelemente direkt.

0voto

paparazzo Punkte 43491

Wahrscheinlich nicht, was Sie suchen, aber dies ist eine Lösung für DataGrid dynamische Spalten. Mit Datagrid können Sie einen Parameter übergeben. http://www.codeproject.com/Articles/36496/Binding-a-Silverlight-DataGrid-to-dynamic-data-Part-2-editable-data-and-INotifyPropertyChanged.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X