5

我正在尝试将图像从窗口绑定到 UserControl 'DisplayHandler' 内的 UserControl'DisplayHandler' 中。Display 有一个 DependancyProperty 'DisplayImage'。This is Similar to this,但他们的回答对我的问题没有帮助。

DisplayHandler 还应该具有“DisplayImage”属性并将绑定传递给 Display。但是 Visual Studio 不允许我两次注册同名的 DependancyProperty。所以我试图不注册两次,而只是重复使用它:

窗户

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

显示处理程序

xml

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

**这两个属性都没有解决。*

展示

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

我一直在想一个控件如果没有定义它自己的值,它会爬上树并寻找它的属性。->参考

所以它应该以某种方式工作......

我对模板和 ContentPresenter 进行了一些尝试,因为这适用于 ImageList(ImageList 还包含显示),但我无法让它像 ListBoxItem 那样绑定值。

4

1 回答 1

5

AddOwner解决方案应该可以工作,但是您必须添加一个更新嵌入式控件的PropertyChangedCallback

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;
    }
}
于 2013-01-11T14:03:43.303 回答