Наследовать от ListBox

Я использую несколько списков в моем проекте вместо деревьев - для правильной виртуализации (много элементов в древовидной структуре). Эти списки почти одинаковы. Единственное отличие в DataTemplates. В этих списках есть несколько событий, которые я должен скопировать и обновить в нескольких местах. Текущие события используются для:

  • предотвращать горизонтальную автоматическую прокрутку
  • поддержка клавиш со стрелками для навигации по древовидной структуре

Я не нашел способа привязать события в одном стиле в словаре ресурсов, поскольку события должны принадлежать определенному классу. Поэтому мне нужно скопировать точно такие же события между классами и привязать их к определенным спискам. Это довольно много текста, как в XAML, так и в коде.

То, что я хотел сделать, - это определить новый пользовательский элемент управления, получая ВСЕ из стандартного ListBox, но переопределяя несколько второстепенных методов (вместо событий). И повторно используйте этот элемент управления везде, где мне нужен такой список, без необходимости копировать все события.

Проблема в том, что мне нужно определить пользовательский . Есть ли способ использовать шаблон/стиль ListBox? Мне не нужны модификации GUI из стандартного ListBox.

Я мог бы пропустить какой-то простой способ выполнить то, что хочу. Я был бы признателен за любой способ сделать это.

1 ответ

Не уверен в настройке, но вам, вероятно, придется переопределить ListBox и ListBoxItem. Затем переопределите некоторые методы:

public partial class MyListBox: ListBox
{ protected override System.Windows.DependencyObject GetContainerForItemOverride() { return new MyListBoxItem(); } protected override bool IsItemItsOwnContainerOverride(object item) { return item is MyListBoxItem; }
}
public class MyListBoxItem : ListBoxItem
{
}

Это заставит ваши контейнеры переопределять ListBoxItem.

Теперь вам просто нужно реализовать специфические ключи кода tof в ListBoxItem. Если вам не нужны изменения стиля, будет применяться стиль ListBox по умолчанию.

Теперь вы можете использовать его в своем XAML:

<local:mylistbox itemssource="{Binding Items}"> <local:mylistbox.itemtemplate> <datatemplate> <textblock text="{Binding id}"> </textblock></datatemplate> </local:mylistbox.itemtemplate>
</local:mylistbox>

licensed under cc by-sa 3.0 with attribution.