- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在对 Cannot find governing FrameworkElement or FrameworkContentElement for target element
错误进行了一些研究后,我发现依赖对象不能真正具有可绑定(bind)的依赖属性,除非它们是 FrameworkElements 或位于其中一个元素的元素树中.
但是,我有一个拥有 DependencyObjects 的 FrameworkElement,我无法将绑定(bind)发送到那些 DependencyObjects 属性,即使它们是 FrameworkElement 逻辑树的一部分。
我正在编写一个带有子元素的复杂自定义控件,我需要这些子元素是 DependencyObjects(但不是 FrameworkElements,因为它们被许多未使用的属性所污染,这可能会使用户感到困惑) ,我还需要他们的 DependencyProperties 是可绑定(bind)的。
我错过了什么?还有什么我需要告诉 DependencyObjects 以便他们知道他们在逻辑树中吗?我是否应该将它们设为 Freezable,即使卡住它们毫无意义?
干杯
最佳答案
我认为你的结论和推论并不完全正确。
第一件事 在 WPF
中,所有内容都派生自 DependencyObject
。 FrameworkElement
类没有任何不同。如果您查看 FrameworkElement
类的层次结构,它就像下面的顺序:
DependencyObject
-->Visual
-->UIElement
-- >FrameworkElement
因此,如果您尝试在派生自上述任何类的类中创建一个Dependency Property
,它只会起作用很好(不包括直接绑定(bind),但可以使用其他绑定(bind)方式(参见下面的示例))。您的 CustomControl
(不确定您使用的是 CustomControl
还是 UserControl
)代码一定有问题。
But classes derived from
UIElement
can also haveDependencyProperties
that can be bound to other elements.
参见UIElement
类,它有很多DependencyProperties
。
请分享您的控件代码,我们可以调查一下。
更新:
这是一个如何绑定(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 ourWindow
changes, it will reflected back to ourMyClass
component's Buttonelement
like we have done binding toButton
itself inXAML
code. So theMyclass
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 andMyClass
will work only like a filter for idiomatic uses.
关于c# - DependencyObject 找不到目标元素的管理 FrameworkElement,即使该对象位于 FrameworkElement 的逻辑树中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36621649/
我正在创建一个基于 TreeView 的可重用自定义控件。我在自定义控件上为控件中的列创建了一个依赖属性,如下所示: public GridViewColumnCollection Colum
仅当我将这些行添加到 OnRender 覆盖方法时才会出现此错误: for (int i = 0; i < this.Width; i++) { dc.DrawImage(Gouttes[i]
我在 WPF 应用程序的单独线程中执行冗长的操作(连接测试、远程数据库表验证等)。在测试期间,我为用户收集关于哪些测试通过了哪些没有通过的信息。信息存储为 List我自己设计的对象: public c
我正在尝试使用 coding4fun toolkit适用于 Windows Phone 7。 InputPrompt input = new InputPrompt(); whoAreYou.Comp
我遇到了 StackOverflowException,这让我发现 DependencyObject 没有正确处理相等性?! 当 DependencyProperty 的类型为 Object 时,它将
XAML 允许我将属性附加到不是从 DependencyObject 派生的类型。例如,我可以为窗口上的 CommandBindings 指定名称: 我在 MSDN ( Attache
我正在努力寻找有关 DependencyObject 使用的属性继承树(或继承上下文)的足够信息。和 DependencyProperty . 我想使用DependencyProperty的值继承能力
我得到了我创建的自定义 DependencyObjects 的集合。但我认为 DependencyObject 来自哪里并不重要。问题是我想要列出它的属性,但是当我查看 DependencyObjec
我有以下代码,它创建一个临时文件夹并使用 FileSystemWatcher 轮询添加到 Location 属性文件夹中的文件,并将它们添加到列表中:Scratchdisk.cs on Pastebi
基于documentation通过 MSDN... You can also use InvalidateProperty to force re-evaluation of a binding ag
我是 WPF 的新手,这是我的第一篇文章。我创建了一个名为“Fruit”的类,它派生自“DependencyObject”并添加了名为“Apple”的额外属性。我创建了一个新的自定义控件,其中包含一个
我有一组绑定(bind)到数据的控件,我想以编程方式将验证器添加到绑定(bind)中。目前,我能够遍历可视化树以找到具有绑定(bind)的控件,并将我的验证器添加到这些控件中。但是为了进一步指定哪些控
我的 XAML 中有这个非常简单的组合框: 这是我背后的代码: public class Test //: System.Windows.DependencyObject { public
如果我的“可见性”(在这种情况下只是一个 bool 值)属性为假,我正在尝试编写客户行为以将某些列宽设置为 0...我的问题是,当我的 on changed 事件触发它时,我的 AssociatedO
我想尝试能够有一个转换器,其参数可以与当前数据上下文绑定(bind)。谁能告诉我为什么到达 Convert() 函数时,Source 属性始终为空? namespace WpfApplication3
一段时间以来,我一直在使用 NUnit 和 Moq 以及我的 Silverlight 代码编写单元测试。我一直遇到的一个问题与 DependencyObjects 有关。 如果有任何东西是从 Depe
WPF - 我正在使用 BackgroundWorker 创建一个 Model3D 对象,但是当我想将它添加到 XAML 中定义的 Model3DGroup 时,出现异常: Cannot use a
我正在创建一个应该在空 XAML 文件中使用的自定义时间: A string 我如何有效地允许我的自定义类 BlackAndWhite 窗口(继承自 DependencyObject 和
我有一个 wpf 表单,我想在用户从控件中做出选择时立即显示加载弹出窗口,因为数据加载可能需要很长时间才能看到,因为数据库不是本地的。在我为弹出窗口创建线程之前,我已经完成了所有工作。 这是我创建线程
我有一个用 wpf 编写的应用程序,它下载一些网页,解析 html 代码并保存一些值。 class ListOfItems { public List ListToBind; p
我是一名优秀的程序员,十分优秀!