使用自定义附加属性的SortDescription

5

在Xaml中,我可以使用local:TestClass.TestProperty="1"来设置自定义的附加属性。

而且,我可以使用{Binding Path=(Namespace:[OwnerType].[PropertyName])}或{Binding Path=(local:TestClass.TestProperty)}来绑定自定义的附加属性。

但是,在SortDescription中如何指定命名空间以使用自定义的附加属性呢?我可以使用new SortDescription("(Grid.Row)", ListSortDirection.Descending)来绑定附加属性,但这里无法设置命名空间...

最好的问候, Jesper

1个回答

2
由于 PropertyPath 构造函数没有命名空间上下文,因此 {Binding a:b.c} 不起作用,而 {Binding Path=a:b.c} 起作用。很遗憾,在 SortDescription 的情况下,你无能为力。你必须找到一种不使用附加属性进行排序的方法。通常我告诉人们,使用 Tag 是糟糕编码的指标,但在这种情况下,Tag 可能是你最好的选择:你可以在 Tag 中创建一个对象,该对象具有返回实际所需的附加属性的属性。在你的 PropertyChangedCallback 中,将 Tag 实例化为内部类的实例。
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中使用Tag的子属性:
<SortDescription PropertyName="Tag.TestProperty" />

如果只有一个属性需要排序,您可以直接使用该属性的标记。

这种方法的主要问题在于使用标记属性会与任何试图使用标记的其他代码发生冲突。因此,您可能需要在标准库中查找一些不适用于相关对象的晦涩依赖属性,并使用它来代替标记。


在对TabControl中的TabItems进行排序时,我决定使用KeyboardNavigation.TabIndex附加属性,这似乎符合概念,希望这不会给我带来任何问题。 - Krimson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接