2013-01-11 17 views
5

Sto cercando di associare un'immagine da una finestra a un 'Display' di UserControl all'interno di un 'DisplayHandler' di UserControl. Il display ha una proprietà di dipendenza 'DisplayImage'. Questo è simile a this, ma le loro risposte non hanno aiutato il mio problema.Come esporre una proprietà di dipendenza di un controllo nidificato in un controllo utente?

DisplayHandler dovrebbe inoltre avere la proprietà 'DisplayImage' e passare il binding a Display. Ma Visual Studio non mi consente di registrare due volte una proprietà di dipendenza con lo stesso nome. Così ho cercato di non registrarlo due volte, ma solo per riutilizzarlo:

finestra

<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); } 
} 

** nessuno dei 2 proprietà funzionato. *

display

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

ho pensato un controllo va su l'albero e cerca la sua proprietà se la propria Il valore non è definito. ->reference

Così dovrebbe lavoro in qualche modo ...

ho fatto alcuni tentativi con Templating e A ContentPresenter causa che ha lavorato per l'ImageList (ImageList contiene anche il Display), ma non sono riuscito a farlo associare il valore come per un oggetto ListBox.

risposta

4

La soluzione AddOwner dovrebbe funzionare, ma è necessario aggiungere un PropertyChangedCallback che aggiorna il controllo incorporato.

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

Grazie! Funziona bene Ma ho appena scoperto, aggiungendo 'DisplayImage =" {Binding RelativeSource = {RelativeSource AncestorType = hview: DisplayHandler}, Path = DisplayImage} "/>' inoltre mi supporta con twoway Binding. –

+0

Speravo solo che fosse _same_ DP e quindi ChangeNotification avrebbe funzionato. In questo modo, sembra che memorizzi nuovamente il valore due volte. Ho sbagliato? –

+0

In realtà è lo stesso DP, ma memorizza il valore due volte. Per prima cosa memorizza il valore su DisplayHandler e poi (nel PropertyCangedCallback) sull'istanza di visualizzazione incorporata. Ma qual è il problema? Sta semplicemente memorizzando un riferimento a un oggetto. O HImage è una struttura di grandi dimensioni? – Clemens

Problemi correlati