我正在尝试将一个图像从一个窗口绑定到一个UserControl'DisplayHandler'内的UserControl'Display'。 Display具有DependancyProperty'DisplayImage'。 这与this类似,但他们的答案对我的问题没有帮助。
DisplayHandler还应具有Property'DisplayImage'并将Binding传递给Display。但Visual Studio不允许我两次注册具有相同名称的DependancyProperty。所以我试着不再注册两次,只是为了重复使用它:
窗口
<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); }
}
**两个属性都没有成功。*
显示
public HImage DisplayImage {
get { return (HImage)GetValue(DisplayImageProperty); }
set { SetValue(DisplayImageProperty, value); }
}
public static readonly DependencyProperty DisplayImageProperty =
DependencyProperty.Register("DisplayImage", typeof(HImage), typeof(Display));
我一直在想,如果没有定义自己的值,Control会上升树并查找其属性。 ->reference
所以应该以某种方式工作......
我使用Templating和ContentPresenter进行了一些尝试,因为它适用于ImageList(ImageList也包含Display),但我无法像ListBoxItem那样绑定值。
答案 0 :(得分:4)
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;
}
}