在研究了Cannot find governing FrameworkElement or FrameworkContentElement for target element错误之后,我发现依赖对象不能真正具有可绑定(bind)的依赖属性,除非它们是FrameworkElements或位于一个元素树中。

但是,我有一个拥有DependencyObjects的FrameworkElement,即使它们是FrameworkElement逻辑树的一部分,也无法将绑定(bind)发送到那些DependencyObjects属性。

我正在使用子元素编写一个复杂的自定义控件,并且我需要将那些子元素作为DependencyObjects(而不是FrameworkElements,因为它们会被许多无法使用的属性所污染,并且可能会使用户感到困惑),并且我还需要它们的DependencyProperty是可绑定(bind)的。

我想念什么?我还有什么要告诉DependencyObjects的,以便他们知道它们在逻辑树中吗?即使卡住它们毫无意义,我是否应该使它们成为Freezable?

干杯

最佳答案

我认为您的结论和推论并不完全正确。

首先,WPF中,一切都源自DependencyObjectFrameworkElement类没有什么不同。如果您查看FrameworkElement类的层次结构,则类似于下面的Order:



因此,如果您尝试在从上述任何一个类派生的类中创建 Dependency Property ,它将很好用(不包括直接绑定(bind),但其他方式有效(请参见下面的示例))。您的CustomControl(肯定不使用CustomControlUserControl)代码一定存在问题。



参见UIElement类,它有很多DependencyProperties

c# - DependencyObject找不到目标元素的管理FrameworkElement,即使该对象位于FrameworkElement的逻辑树中也是如此-LMLPHP

请分享您的控件代码,我们可以对此进行调查。

更新:

这是一个如何绑定(bind)DependecyObject's DependencyProperty的示例:

DependencyObject实现:

public class MyClass : DependencyObject
{
    public MyClass()
    {
        this.Button = new Button();
        Button.Width = 500;
        Button.Height = 400;
        Button.Content = "Bound to Window Height";
    }

    private Binding height;
    public Binding Height
    {
        get { return height; }
        set
        {
            height = value;
            ApplyBinding();
        }
    }

    public Button Button { get; set; }
    private void ApplyBinding()
    {
        this.Button.SetBinding(Button.HeightProperty, this.Height);
    }

}

使用我们的UserControl实现的DependencyObject:
public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }

    public MyClass MyClass
    {
        get { return (MyClass)GetValue(MyClassProperty); }
        set { SetValue(MyClassProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyClass.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyClassProperty =
        DependencyProperty.Register("MyClass", typeof(MyClass), typeof(MyUserControl), new UIPropertyMetadata(new PropertyChangedCallback(MyClassPropertyChanged)));


    private static void MyClassPropertyChanged(DependencyObject DO, DependencyPropertyChangedEventArgs e)
    {
        var MUC = DO as MyUserControl;
        if (e.NewValue != null)
        {
            var myClass = e.NewValue as MyClass;
            MUC.MyCanvas.Children.Add(myClass.Button);
        }
    }

}

和最后绑定(bind):
<Window x:Class="WpfStackOverflowTempProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"  Width="525"
    DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"
    xmlns:local="clr-namespace:WpfStackOverflowTempProject"
    Height="{Binding ElementName=UIContent,Path=MyClass.HeightReplica,Mode=OneWayToSource}"
    >
<local:MyUserControl x:Name="UIContent" >
    <local:MyUserControl.MyClass>
        <local:MyClass Height="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=ActualHeight,Mode=OneWay}" />
    </local:MyUserControl.MyClass>
</local:MyUserControl>

关于c# - DependencyObject找不到目标元素的管理FrameworkElement,即使该对象位于FrameworkElement的逻辑树中也是如此,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36621649/

10-13 05:57