2010-12-29 13 views
2

Da UserControls in WPF parameterlose Konstruktoren haben müssen, ist die richtige Methode, um sie mit ziemlich komplexen Daten zu versorgen, die "nahe" der Konstruktionszeit benötigt werden. Ich habe versucht, Abhängigkeitseigenschaften dafür zu verwenden, aber ich stolperte über Probleme mit dem Visual Studio-Designer, der bei Versuchen buckelt, Sachen wie eine Dictionary<string,MyObject> in eine IDictionary<string,MyObject> typisierte Abhängigkeitseigenschaft zu übergeben. Irgendwann muss es eine genaue Kompilierzeit-Typübereinstimmung wünschen oder das XAML wird nicht in dem Designer angezeigt, obwohl die Anwendung problemlos ausgeführt werden kann.Übergeben großer Datenmengen an Benutzersteuerelemente

Grundsätzlich möchte ich einen guten Weg, um Dinge, die ich normalerweise in einem Konstruktor in ein Benutzersteuerelement übergeben würde übergeben. Was ist der beste Weg?

Update: Das betreffende Benutzersteuerelement wird immer von XAML erstellt, so dass eine nicht-parameterlose Konstruktion zusätzlich zu der parameterlosen keine Option ist.

Update 2: Eine interessante Idee wäre, etwas vom parameterlosen Konstruktor zugänglich zu machen, von dem ich meine Initialisierungsdaten erhalten kann. Etwas, das vielleicht die Frage stellt: Welcher meiner bereits initialisierten Vorfahren implementiert eine IMyDataProvider-Schnittstelle? Dies könnte ähnlich wie die relative Quelle zu Vorläufertyp Bindungen funktionieren, außer programmgesteuert aus dem Benutzersteuerelement Konstruktor getan.

Antwort

1

Ein paar Optionen.

1, Sie können mehr als einen Konstruktor haben, einen parameterlosen, wenn Ihre Kontrolle über XAML erstellt wird, und einen anderen, der eine Reihe von Parametern für die direkte Erstellung über Code enthält. Wenn Sie Ihre Instanz auf keinen Fall über Code erstellen möchten, dann ...

2, Fügen Sie eine öffentliche Eigenschaft hinzu, die nur einen Setter hat und mit dem exakten Dictionary-Typ definiert ist, den Sie übergeben und als Daten verwenden möchten zum Initialisieren der Steuerung. Die Eigenschaft muss nur einmal aufgerufen werden. Sie können andere Eigenschaften haben, bei denen es sich um Getter/Setter handelt, die diese initialisierten Daten in einer Reihe allgemeinerer Typen verfügbar machen.

+0

Ich möchte auf jeden Fall die Kontrolle über XAML erstellen, also ist dies der Rahmen, in dem ich suche. Was ich nicht verstehe, ist, warum die Abhängigkeitseigenschaft den genauen Typ haben muss und nicht ein Basistyp, der von XAML über die Bindung verwendet werden soll. –

+0

Ich bin mir auch nicht sicher warum. Beachten Sie jedoch, dass die Eigenschaft, mit der Ihre Daten in das Steuerelement übertragen werden, sich von der Eigenschaft unterscheiden kann, die verwendet wird, um sie als Abhängigkeitseigenschaften nach hinten freizulegen. Daher wird Ihre Setter-Eigenschaft nur einmal zum Einrichten des Steuerelements verwendet und dann nie wieder aufgerufen. –

+0

Aber wie stelle ich Daten zu dieser Setter-Eigenschaft über XAML zur Verfügung? Ist es eine Abhängigkeitseigenschaft? –

2

Wenn Sie nur abgeleitete Typen übergeben, können Sie stattdessen eine einfache konkrete Containerklasse übergeben, die Ihre komplexen Typen als Eigenschaften enthält. Zum Beispiel:

public class InitializationData 
{ 
    public IDictionary<TKey, TValue> Dictionary { get; set; } 
} 

Diese Ebene der Indirektion wird die Einschränkungen des Visual Studio-Designers überwinden.

+0

Wow, wie habe ich etwas so offensichtlich übersehen. Nun, das ist definitiv eine gute Standby-Lösung, wenn es keine bessere gibt. –

Verwandte Themen