2010-12-29 4 views
1

Ich möchte eine Benutzersteuerungseigenschaft auf den Wert einer Eigenschaft in einem übergeordneten Steuerelement festlegen. Nehmen wir beispielsweise an, dass mein Hauptfenstersteuerelement einige anfängliche Konfigurationsdaten enthält. Derzeit verwende ich die folgenden in XAML:Verknüpfen der Benutzersteuerungseigenschaft mit der benannten übergeordneten Eigenschaft

<Window x:Class="MyProject.MainWindow" 
     x:Name="TopWindow" ... > 
    ... 
    <local:MyUserControl Config="{Binding ElementName=TopWindow, 
           Path=MyUserControlConfig, Mode=OneTime}" /> 
</Window> 

Aber dies scheint zwei Abhängigkeitseigenschaften zu erfordern, eine in der Mainwindow (MyUserControlConfig):

namespace MyProject 
{ 
    public partial class MainWindow: Window 
    { 
    public static readonly DependencyProperty MyUserControlConfigProperty= 
     DependencyProperty.Register("MyUserControlConfig", 
     typeof(UserControlConfig), typeof(MainWindow)); 

    public UserControlConfig MyUserControlConfig 
    { 
     get { return (UserControlConfig) 
     GetValue(MyUserControlConfigProperty); } 
     set { SetValue(MyUserControlConfigProperty, value); } 
    }  
    } 
} 

und eine in MyUserControl (Config):

namespace MyProject 
{ 
    public partial class MyUserControl: UserControl 
    { 
    public static readonly DependencyProperty ConfigProperty= 
     DependencyProperty.Register("Config", 
     typeof(UserControlConfig), typeof(MainWindow)); 

    public UserControlConfig Config 
    { 
     get { return (UserControlConfig) GetValue(ConfigProperty); } 
     set { SetValue(ConfigProperty, value); } 
    }  
    } 
} 

Ich muss wirklich keine Änderungen beobachten, nur um Daten zum Zeitpunkt der Erstellung in meine Benutzersteuerung zu übergeben. Ist dies mit einfachen Eigenschaften für mindestens eines der beiden möglich oder muss ich zwei Abhängigkeitseigenschaften verwenden, um diese (einmalige) Initialisierung durchzuführen?

aktualisieren: Jay-Lösung läßt uns mit nur einer CLR-Eigenschaft in der Mainwindow-Klasse:

namespace MyProject 
{ 
    public partial class MainWindow: Window 
    { 
    public UserControlConfig MyUserControlConfig {get; private set;} 
    ... 
    } 
} 

Nun, wenn es nur möglich war, die Abhängigkeitseigenschaft von der MyUserControl Klasse zu entfernen und ersetzen Sie es mit einem einfachen Eigenschaft, die immer noch über XAML-Bindung (oder einen anderen XAML-Mechanismus) initialisiert wird, sodass ich die Datenquelle über XAML übergeben kann.

+0

Die MyUserControlConfig-Eigenschaft im UserControl muss keine Abhängigkeitseigenschaft sein, eine normale CLR-Eigenschaft funktioniert problemlos. Eine Abhängigkeitseigenschaft ist nur erforderlich, wenn Sie die Eigenschaft an etwas anderes binden möchten, also muss Config ein DP sein –

+0

@Meleak Ich denke, dass rückwärts ist? 'ConfigProperty' sollte eine DP sein und' MyUserControlConfigProperty' muss nicht vorhanden sein, da erstere an die letztere bindet. – Jay

+0

@Jay: In der Tat war es :) Ich schaute auf die Frage erneut und aktualisierte meinen Kommentar –

Antwort

1

Ich könnte mich irren, aber wenn Sie an CLR-Eigenschaften für andere Klassen binden können, würde ich erwarten, dass Sie an eine CLR-Property in Ihrer Klasse MainWindow binden könnten.

Haben Sie das versucht?

+0

Ich habe versucht, eine öffentliche automatisch definierte Eigenschaft im Hauptfenster zu verwenden: UserControlConfig MyUserControlConfig {get; set;}, das im MainWindow-Konstruktor initialisiert wurde. Aber obwohl der Code fehlerfrei kompiliert wurde, wurde die Config-Eigenschaft in MyUserControl nicht auf einen Wert festgelegt (d. H., Es blieb null). Nur wenn ich UserControlfig eine Abhängigkeitseigenschaft in MainWindow gemacht habe, hat die Übergabe seines Wertes über die Binding-Funktion funktioniert. Vielleicht mache ich etwas falsch? –

+0

Ich habe gerade versucht, die MainWindow-Eigenschaft wieder zu einer regulären automatisch generierten Eigenschaft zu machen, die im MainWindow-Konstruktor initialisiert wurde und tatsächlich funktioniert. Ich habe beim letzten Mal etwas durcheinandergebracht. Vielen Dank für Ihre Hilfe! –

Verwandte Themen