2009-04-30 53 views

回答

0

更多挖

有一个ReadLocalValue方法,这是愚蠢的阅读,而不是得到这么难在智能感知被发现后更新。 (我认为Apress的WPF书实际上有一个关于这个的注释。)如果没有设置该值,它将返回UnsetValue

if (ReadLocalValue(Control.DataContextProperty) != 
    DependencyProperty.UnsetValue) 
{ 
    // Data context was set locally. 
} 

如果你因为某些原因需要得到所有本地设置属性,可以使用LocalValueEnumerator。

LocalValueEnumerator enumerator = GetLocalValueEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    if (enumerator.Current.Property == Control.DataContextProperty) 
    { 
     // DataContext was set locally 
    } 
} 

而这两个方法真的让我感到惊讶。在GetLocalValueEnumerator中读取而不是读取ReadLocalValue和一个不能用foreach迭代的集合。这就像.Net拥有这些WPF团队决定忽略的标准事物。

+0

我之前使用'ReadLocalValue'来确定是否在自定义'Panel'中设置了一个值。它导致了一些非常奇怪的行为,当一个值被一个样式应用时,我的面板仍然会认为这个值没有设置。只有在调用'SetValue'时,面板才会按照它们应该的方式开始概述我的元素,尽管'GetValue'确实返回了值。去了解正确的方法是按[肯特的答案](http://stackoverflow.com/a/809480/590790),它给你的所有信息,而不仅仅是副作用(本地值)。 – 2015-02-22 23:20:28

0

枚举器是标准的,他们只是没有提供一个使用该枚举器的集合作为它的GetEnumerator方法(这是什么使For Each工作)的结果。另外,从我的经验来看,用枚举数而不是集合来编写分层算法通常更容易,所以我不会惊讶他们不会提供这个。