gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:46:40 25 4
gpt4 key购买 nike

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

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

我正在编写一个带有子元素的复杂自定义控件,我需要这些子元素是 DependencyObjects(但不是 FrameworkElements,因为它们被许多未使用的属性所污染,这可能会使用户感到困惑) ,我还需要他们的 DependencyProperties 是可绑定(bind)的。

我错过了什么?还有什么我需要告诉 DependencyObjects 以便他们知道他们在逻辑树中吗?我是否应该将它们设为 Freezable,即使卡住它们毫无意义?

干杯

最佳答案

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

第一件事WPF 中,所有内容都派生自 DependencyObjectFrameworkElement 类没有任何不同。如果您查看 FrameworkElement 类的层次结构,它就像下面的顺序:

DependencyObject --> Visual --> UIElement -- > FrameworkElement

因此,如果您尝试在派生自上述任何类的类中创建一个Dependency Property,它只会起作用很好(不包括直接绑定(bind),但可以使用其他绑定(bind)方式(参见下面的示例))。您的 CustomControl(不确定您使用的是 CustomControl 还是 UserControl)代码一定有问题。

But classes derived from UIElement can also have DependencyProperties that can be bound to other elements.

参见UIElement类,它有很多DependencyProperties

UIElement

请分享您的控件代码,我们可以调查一下。

更新:

这是一个如何绑定(bind) DependencyObject 的 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>

So as output of above program when Height of our Window changes, it will reflected back to our MyClass component's Button element like we have done binding to Button itself in XAML code. So the Myclass is a interface between it's logical parent control & it's children elements for specifying the exposed properties/bindings and defining the behave of them corresponding to the child elements, which actually will be visible on the UI and MyClass will work only like a filter for idiomatic uses.

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com