2013-01-11 15 views
5

Görüntüyü bir Pencereden bir UserControl 'DisplayHandler' içindeki UserControl 'Ekranına' bağlamaya çalışıyorum. Ekranda bir DependancyProperty 'DisplayImage' var. Bu, this'a benzer, ancak yanıtları sorunuma yardımcı olmadı.Bir UserControl'de iç içe geçmiş bir Denetimin Bağımlılık Özelliği nasıl ortaya çıkarılır?

DisplayHandler ayrıca 'DisplayImage' özelliğine sahip olmalı ve Bağlamayı Ekrana geçirmelidir. Ancak Visual Studio, bir DependancyProperty dosyasını aynı ada sahip iki kez kaydetmeme izin vermiyor. Bu yüzden iki kez kayıt çalıştı ama yalnızca onu yeniden:

pencere

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

** 2 özelliklerin hiçbiri çalıştı. *

Ekran

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

Düşünüyorum da bir denetim Ağacı artar ve kendi halinde onun Mülkiyet arar Değer tanımlanmamıştır. ->reference

Yani gerektiği şekilde eser ... ki (Imagelist ayrıca Display içerir) ImageList çalıştı çünkü

Ben şablon ve A ContentPresenter bazı girişimlerde ama bunu alamadım ListBoxItem için gibi bir değer bağlayın.

cevap

4

AddOwner çözümü çalışıyor olmalı, ancak gömülü denetimi güncelleyen bir PropertyChangedCallback eklemeniz gerekir.

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

Teşekkürler! Bu iyi çalışıyor. Ama daha yeni öğrendim, 'DisplayImage =" {Binding RelativeSource = {RelativeSource AncestorType = hview: DisplayHandler}, Path = DisplayImage} "/>' ek olarak twoway Binding ile beni destekliyor. –

+0

Sadece _same_ DP olduğunu umuyorum ve bu yüzden ChangeNotification işe yarayacaktı. Bu şekilde görünüyor, yine değeri iki kez saklar. Yanlış mıyım? –

+0

Aslında aynı DP'dir, ancak değeri iki kez depolar. İlk önce, DisplayHandler'daki değeri ve gömülü Görüntü örneğindeki (PropertyCangedCallback'de) depolar. Ama sorun ne? Sadece bir nesne referansı saklıyor. Yoksa HImage büyük bir yapı mıdır? – Clemens

İlgili konular