2013-01-11 12 views
5

Ich versuche, ein Bild aus einem Fenster in ein UserControl 'Display' zu binden, das in einem UserControl 'DisplayHandler' ist. Die Anzeige hat eine DependancyProperty 'DisplayImage'. Das ist ähnlich zu this, aber ihre Antworten haben nicht mit meinem Problem geholfen.Wie Sie eine DependencyProperty eines Steuerelements in einem UserControl verschachteln?

DisplayHandler sollte auch die Eigenschaft 'DisplayImage' haben und Binding an Display übergeben. Aber Visual Studio erlaubt mir nicht, eine DependancyProperty mit dem gleichen Namen zweimal zu registrieren. Also habe ich versucht, es nicht zweimal zu registrieren, aber nur es wieder zu verwenden:

Fenster

<my:DisplayHandler DisplayImage= 
    "{Binding ElementName=ImageList, Path=SelectedItem.Image}" /> 

DisplayHandler

XAML

<my:Display x:Name="display1"/> 

cs

public static readonly DependencyProperty DisplayImageProperty = 
    myHWindowCtrl.DisplayImageProperty.AddOwner(typeof(DisplayHandler)); 

public HImage DisplayImage { 
    get { return (HImage)GetValue(DisplayImageProperty); } 
    set { SetValue(DisplayImageProperty, value); } 
} 
public HImage DisplayImage /*alternative*/ { 
    get { return (HImage)display1.GetValue(Display.DisplayImageProperty); } 
    set { display1.SetValue(Display.DisplayImageProperty, value); } 
} 

** keiner der zwei Eigenschaften ausgearbeitet. *

Anzeige

public HImage DisplayImage { 
    get { return (HImage)GetValue(DisplayImageProperty); } 
    set { SetValue(DisplayImageProperty, value); } 
} 
public static readonly DependencyProperty DisplayImageProperty = 
    DependencyProperty.Register("DisplayImage", typeof(HImage), typeof(Display)); 

Ich habe eine Kontrolle gedacht, den Baum nach oben geht und sucht nach seiner Eigenschaft, wenn seine eigenen Wert ist nicht definiert. ->reference

So ist es sollte Arbeit irgendwie ...

Ich habe einige Versuche mit Templating und A Content, weil das für die Abbildungsliste gearbeitet (Abbildungsliste enthält auch das Display), aber ich konnte nicht bekommen zu Binden Sie den Wert wie für ein ListBoxItem.

Antwort

4

Die AddOwner Lösung sollte funktionieren, aber Sie müssen eine PropertyChangedCallback hinzufügen, die das eingebettete Steuerelement aktualisiert.

public partial class DisplayHandler : UserControl 
{ 
    public static readonly DependencyProperty DisplayImageProperty = 
     Display.DisplayImageProperty.AddOwner(typeof(DisplayHandler), 
      new FrameworkPropertyMetadata(DisplayImagePropertyChanged)); 

    public HImage DisplayImage 
    { 
     get { return (Image)GetValue(DisplayImageProperty); } 
     set { SetValue(DisplayImageProperty, value); } 
    } 

    private static void DisplayImagePropertyChanged(
     DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var dh = obj as DisplayHandler; 
     dh.display1.DisplayImage = e.NewValue as HImage; 
    } 
} 
+0

Danke! Das funktioniert gut. Aber ich habe gerade herausgefunden, 'DisplayImage =" {Bindende RelativeSource = {RelativeSourceAncestorType = hview: DisplayHandler}, Path = DisplayImage} "/>' zusätzlich unterstützt mich mit twoway-Bindung. –

+0

Ich hoffte nur, es wäre die _same_ DP und so würde die ChangeNotification funktionieren. So scheint es, es speichert den Wert erneut zweimal. Liege ich falsch? –

+0

Es ist eigentlich die gleiche DP, aber es speichert den Wert zweimal. Zuerst speichert es den Wert im DisplayHandler und dann (im PropertyCangedCallback) für die eingebettete Display-Instanz. Aber was ist das Problem? Es speichert nur eine Objektreferenz. Oder ist IHr eine große Struktur? – Clemens

Verwandte Themen