出于与{Binding Path=a:b.c}
工作原理相同的原因,但{Binding a:b.c}
不能:PropertyPath构造函数没有名称空间上下文。
不幸的是,在SortDescription的情况下,你可以做的事情不多。您必须找到一种不使用附加属性的方式进行排序。
通常我会告诉人们Tag的使用是错误编码的指示器,但在这种情况下,Tag可能是您的最佳选择:您可以在Tag中创建具有返回所需实际附加属性的属性的对象。
在你PropertyChangedCallback,实例变量,以一个内部类的一个实例:
public class TestClass : DependencyObject
{
... TestProperty declaration ...
PropertyChangedCallback = (obj, e) =>
{
...
if(obj.Tag==null) obj.Tag = new PropertyProxy { Container = obj };
});
public class PropertyProxy
{
DependencyObject Container;
public SomeType TestProperty { get { return GetTestProperty(Container); } }
}
}
现在你可以使用标签的子属性在SortDescription:
<SortDescription PropertyName="Tag.TestProperty" />
如果只有一个单独的属性进行排序,你可以简单地使用它的标签。
与此相关的主要问题是使用Tag属性将与任何其他代码也会尝试使用标记相冲突。因此,您可能需要在标准库中寻找一些不明显的DependencyProperty,它们甚至不适用于有问题的对象,而是使用它代替Tag。
当我在TabControl中对TabItems进行排序时,我决定使用KeyboardNavigation.TabIndex附属属性,这似乎符合这个概念,并且希望不会给我任何问题。 – Krimson 2010-06-17 08:18:37