Вы не можете по той же причине, что и {Binding Path=a:b.c}
, но {Binding a:b.c}
не имеет: Конструктор PropertyPath не имеет контекста пространства имен.
К сожалению, в случае SortDescription вы не можете с этим поделать. Вы должны найти способ сортировки без использования прикрепленных свойств.
Обычно я говорю людям, что использование тега является индикатором плохого кодирования, но в этом случае тег может быть вашим лучшим вариантом: вы можете создать объект в теге, у которого есть свойства, которые возвращают нужные свойства, которые вы хотите.
В вашем 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); } }
}
}
Теперь вы можете использовать суб-свойство Tag в вашем SortDescription:
<SortDescription PropertyName="Tag.TestProperty" />
Если есть только одно свойство, которое нужно отсортировать, вы можете просто использовать тег для него.
Основная проблема заключается в том, что использование свойства Tag противоречит любому другому коду, который также пытается использовать тег. Таким образом, вы можете захотеть найти какой-то непонятный DependencyProperty в стандартных библиотеках, которые даже не применяются к рассматриваемым объектам, и использовать это вместо Tag.
Как я сортирую TabItems в TabControl, я решил использовать прикрепленное свойство KeyboardNavigation.TabIndex, которое, похоже, вписывается в концепцию, и это, надеюсь, не даст мне никаких проблем. – Krimson