- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了 StackOverflowException,这让我发现 DependencyObject 没有正确处理相等性?!
当 DependencyProperty 的类型为 Object
时,它将始终使用 Reference.Equals
。当应用相同的值时,这会导致每次为字符串和值类型触发 PropertyChanged。
如果你看一下
DependencyObject.Equals(DependencyProperty dp, object value1, object value2)
https://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,3453
/// <summary>
/// Helper method to compare two DP values
/// </summary>
private bool Equals(DependencyProperty dp, object value1, object value2)
{
if (dp.IsValueType || dp.IsStringType)
{
// Use Object.Equals for Strings and ValueTypes
return Object.Equals(value1, value2);
}
else
{
// Use Object.ReferenceEquals for all other ReferenceTypes
return Object.ReferenceEquals(value1, value2);
}
}
一种简单的复现方式:
public static readonly DependencyProperty ObjValueProperty = DependencyProperty.Register(nameof(ObjValue), typeof(object), typeof(MainWindow), new PropertyMetadata(default(object)));
public object ObjValue
{
get
{
return GetValue(ObjValueProperty);
}
set
{
SetValue(ObjValueProperty, value);
}
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
if(e.Property == ObjValueProperty) { /*Breakpoint here*/ }
}
...
ObjValue = 7;
ObjValue = 7;
那么,这是期望的行为还是错误?
最佳答案
我不认为这是一个错误。它只是 dotnet 处理对象的方式。如果你在没有 DependencyProperties 上下文的情况下尝试它是一样的:
我创建了一个小型控制台应用程序:
object v1 = 7;
object v2 = 7;
if (v1 == v2) Console.Write("are the same"); else Console.Write("are different");
我在控制台中读到“不同”。所以一般来说,如果对象被评估为相等,那么总是通过 ReferenceEquals(即使它们是装箱值类型)。
关于c# - DependencyObject 不能很好地处理对象属性的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53046480/
我正在创建一个基于 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
我是一名优秀的程序员,十分优秀!