2013-01-11 9 views
5

Próbuję przywiązać obraz z okna do "monitora" UserControl wewnątrz "wskazówki użytkownika" UserControl. Wyświetlacz ma DependancyProperty "DisplayImage". To jest podobne do this, ale ich odpowiedzi nie pomogły w rozwiązaniu mojego problemu.Jak ujawnić zależność Kontrola kontroli zagnieżdżonej w UserControl?

DisplayHandler powinien również posiadać właściwość "DisplayImage" i przekazywać oprawę do wyświetlania. Ale program Visual Studio nie pozwala mi dwukrotnie zarejestrować usługi DependancyProperty o tej samej nazwie. Więc starałem się nie zarejestrować go dwa razy, ale tylko do jej ponownego wykorzystania:

okno

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

** żadna z 2 mieszkań wypracowane. *

Wyświetlacz

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

myślałem Control idzie w górę Drzewa i patrzy na swoją własność, jeżeli jego własny Wartość nie jest zdefiniowana. ->reference

Więc powinien praca jakoś ...

Zrobiłem kilka prób z Templating i A ContentPresenter dlatego, że pracował dla ImageList (ImageList zawiera również wyświetlacz), ale nie mogę zmusić go do powiązać wartość jak dla obiektu ListBoxItem.

Odpowiedz

4

Powinno działać rozwiązanie AddOwner, ale trzeba dodać PropertyChangedCallback, które aktualizuje wbudowany formant.

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

Dzięki! To działa dobrze. Ale właśnie się dowiedziałem, dodając: 'DisplayImage =" {Binding RelativeSource = {RelativeSource AncestorType = hview: DisplayHandler}, Path = DisplayImage} "/>' dodatkowo wspiera mnie z Twoway Binding. –

+0

Miałem tylko nadzieję, że to był znak DP, więc funkcja ChangeNotification zadziała. W ten sposób wydaje się, że ponownie przechowuje wartość dwukrotnie. Czy się mylę? –

+0

W rzeczywistości jest to ten sam DP, ale przechowuje wartość dwukrotnie. Najpierw przechowuje wartość w DisplayHandler, a następnie (w PropertyCangedCallback) we wbudowanej instancji Display. Ale w czym problem? To po prostu przechowywanie odniesienia do obiektu. A może HImage to duża struktura? – Clemens

Powiązane problemy