SortDescription с пользовательским вложенным свойством - PullRequest
3 голосов
/ 16 июня 2010

В Xaml я могу установить пользовательское свойство с помощью местный: TestClass.TestProperty = "1"

Я могу привязать к пользовательскому прикрепленному свойству, используя {Binding Path = (Пространство имен: [OwnerType]. [PropertyName])} {Binding Path = (local: TestClass.TestProperty)}

Но как мне указать пространство имен, когда мне нужно использовать пользовательское присоединенное свойство в SortDescription? Я могу привязать к прикрепленному свойству используя new SortDescription ("(Grid.Row)", ListSortDirection.Descending) но здесь я нигде не могу установить пространство имен ...

С наилучшими пожеланиями, Jesper

1 Ответ

2 голосов
/ 16 июня 2010

Вы не можете, по той же причине, что {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.

Основная проблема в этом заключается в том, чтосвойство Tag будет конфликтовать с любым другим кодом, который также пытается использовать тег.Так что вы можете захотеть найти какой-то неясный объект DependencyProperty в стандартных библиотеках, который даже не применяется к рассматриваемым объектам, и использовать его вместо Tag.

...