c# - WPF Sentinel 对象以及如何检查内部类型

标签 c# .net wpf data-binding wpf-4.0

正如你们中的一些人所发现的,WPF 4 出现了一个新功能(?),其中数据绑定(bind)引擎可以传递类 MS.Internal.NamedObject 的自定义控件实例,名称为“{DisconnectedItem}"到 DataContext - 而不是您的代码期望的数据项(当模板化控件与其 ItemsControl 断开连接时会发生这种情况)。这些被称为哨兵对象。

在现有代码中,这可能会导致代码没有准备好的虚假异常。这些可能会被数据绑定(bind)子系统吞没,或者它们会造成严重破坏。密切关注您的调试控制台。

无论如何,我是在this MSDN forum上了解到这件事的.山姆·本特 (Sam Bent) 发表了一篇文章 explains it all .现在就去读吧,你会想知道的。本质是这些事件不应该被触发(这是错误),所以:

Ignore the DataContextChanged event if the DataContext is a sentinel object.

所以,所以我想检查我的 DataContext。但是怎么办?考虑:

public bool IsSentinelObject(object dataContext)
{
    return (dataContext is MS.Internal.NamedObject);
}

猜猜会发生什么?它不会编译,因为 MS.Internal.NamedObject 是内部的,我无法访问。当然,我可以这样破解它:

public bool IsSentinelObject(object dataContext)
{
    return dataContext.GetType().FullName == "MS.Internal.NamedObject"
           || dataContext.ToString() == "{DisconnectedObject}";
}

(或其他有效的东西)。我也听从了 Sam 的建议来缓存对象以供以后进行引用相等性检查(这是一个单例)。

当然,这意味着我没有问题,不是真的。但我很好奇,这篇文章肯定会让一些用户受益,所以无论如何都值得一问:

有没有一种方法可以根据内部 NamedObject 类型准确检查类型,而无需求助于字符串比较?

最佳答案

在 .NET 4.5 中,您现在可以与 BindingOperations.DisconnectedSource 进行比较。

关于c# - WPF Sentinel 对象以及如何检查内部类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868786/

相关文章:

wpf - 水平拉伸(stretch) WPF Canvas

wpf - 如何本地化 DatePicker?

c# - 整个应用程序中使用的单个对象应该是静态的吗?

c# - 如何防止 WCF 服务进入故障状态?

c# - 将 RTF 字符串合并为一个

.net - 如何在没有管理员权限的情况下初始化Windows套接字库

wpf - 是否可以像在 WPF 中扩展样式一样扩展 ControlTemplate?

C# 可以在抽象类中有构造函数吗?

c# - WPF寻找方法来创建带有文本标签框架的边框

c# - 如何在 XAML 中处理 "float"图像 (Windows 8 Metro)