2010-06-16 47 views
3

在XAML我可以设置使用自定义的附加属性 本地:TestClass.TestProperty =“1”SortDescription自定义附加属性

一个I可以结合使用 {结合路径=(命名空间的自定义附加属性: [OwnerType]。[PropertyName])} {Binding Path =(local:TestClass.TestProperty)}

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

最好的问候, 加斯帕

回答

2

出于与{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。

+0

当我在TabControl中对TabItems进行排序时,我决定使用KeyboardNavigation.TabIndex附属属性,这似乎符合这个概念,并且希望不会给我任何问题。 – Krimson 2010-06-17 08:18:37