具有自定义附加属性的SortDescription

时间:2010-06-16 13:19:02

标签: wpf attached-properties

在Xaml中我可以使用设置自定义附加属性 当地:TestClass.TestProperty = “1”

我可以使用绑定到自定义附加属性 {Binding Path =(命名空间:[OwnerType]。[PropertyName])} {Binding Path =(local:TestClass.TestProperty)}

但是当我需要在SortDescription中使用自定义附加属性时,如何指定命名空间? 我可以使用绑定到附加属性 new SortDescription(“(Grid.Row)”,ListSortDirection.Descending) 但在这里我无法在任何地方设置命名空间......

最诚挚的问候, 的Jesper

1 个答案:

答案 0 :(得分:2)

由于{Binding Path=a:b.c}的工作原理与{Binding a:b.c}无关,因此你不能这样做:PropertyPath构造函数没有命名空间上下文。

不幸的是,在SortDescription的情况下,你无能为力。您必须找到一种不使用附加属性进行排序的方法。

通常情况下,我告诉人们使用Tag是编码错误的指标,但在这种情况下,Tag可能是您的最佳选择:您可以在Tag中创建一个具有返回所需实际附加属性的属性的对象。 p>

在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" />

如果只有一个属性需要排序,您只需使用标记即可。

这个问题的主要问题是使用Tag属性会与尝试使用Tag的任何其他代码冲突。因此,您可能希望在标准库中查找一些模糊的DependencyProperty,它甚至不适用于有问题的对象,而是使用它而不是Tag。