|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
В этой статье у автора есть модели представления для узлов дерева, но такое ощущение, что на каждый раз приходится делать новую модель представления. Потому что презентационные свойства (свойства, относящиеся к виду узла, развёрнут ли он и т. п.) у него перемешаны со свойтсвами данных (т. е. относящимися к модели). Я выделил только презентационную часть и у меня получилась универсальная модель узла: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76.
Проблема в том, что я не могу сделать эту модель реюзабельной. Т. е. желательно, чтобы эта базовая модель была базовым классом для модели представления, которую я хочу отобразить в виде дерева. Как сделать эту мою базовую модель реюзабельной с требованиями: - вместо Model должен быть любой тип модели; - этот тип модели должен иметь свойство Children, возвращающее IEnumerable<Model>? И более общий вопрос - кто как делал у себя модели представлений для отображения в TreeView? У вас есть какая-то универсальная модель, или каждый раз заново делаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 20:38 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
В свойствао IsExpanded и IsSelected не обращайте внимания на строчки вида Код: c# 1.
На самом деле там обычный сеттер вида _isExpanded = value. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 20:41 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320, Например, так: 1) Ввести для модели такой интерфейс: Код: c# 1. 2. 3. 4.
2) Вот так модифицировать класс Noded_VM: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 20:46 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Noded_VM<T> _parent * ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 20:48 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320, если конкретный тип поля _current не важен, то можно обойтись и без генерика, просто подставив в ваш код вместо Model ITreeModel ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 20:51 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Еще 1 фикс: Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 20:55 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Я тоже раньше к такой реализации приходил. Но запутался в деталях. В частности, и у меня тогда, и по вашей реализации сейчас (включая все ваши последние фиксы) я получал ошибку на строке Код: c# 1.
Ошибка такая Argument 1: cannot convert from 'ITreeNodeModel' to 'T' ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 21:09 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320Argument 1: cannot convert from 'ITreeNodeModel' to 'T' Это тот же ваш интерфейс ITreeModel, просто я его по-другому назвал. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 21:10 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320Argument 1: cannot convert from 'ITreeNodeModel' to 'T' Это тот же ваш интерфейс ITreeModel, просто я его по-другому назвал. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 21:10 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Ну и далее те же проблемы, что были и у меня. Беру объект, который выполняет интерфейс ITreeNodeModel: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Ошибка такая 'Quest' does not implement interface member 'ITreeNodeModel.Children'. 'Quest.Children' cannot implement 'ITreeNodeModel.Children' because it does not have the matching return type of 'System.Collections.Generic.IEnumerable<ITreeNodeModel>'. Я не понимаю, почему я не реализовал интерфейс - ведь List реализует IEnumerable. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 21:24 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Вот класс, расширяющий класс Noded_VM Код: c# 1. 2. 3. 4. 5. 6.
Ошибка на строчке base(current) авторArgument 1: cannot convert from 'Quest' to 'ITreeNodeModel' ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 21:28 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320Ошибка на строчке base(current) авторArgument 1: cannot convert from 'Quest' to 'ITreeNodeModel' Тоже не понятно, почему нильзя привести, ведь Quest наследуется от ITreeNodeModel. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2014, 21:29 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
ведь List реализует IEnumerable. - и что? Он требует именно IEnumerable ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2014, 20:28 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Lelouchведь List реализует IEnumerable. - и что? Он требует именно IEnumerable Он не только требует IEnumerable, но и ITreeNodeModel вместо типа, его реализуюего. Т. е. не только нельзя, чтобы Children возвращал это List<Quest> но и это List<ITreeNodeModel> и это IEnumerable<Quest> А как же приведение типов? Такое ощущение, что приведение типов работает в runtime, но не в designtime. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 07:27 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320Lelouchведь List реализует IEnumerable. - и что? Он требует именно IEnumerable Он не только требует IEnumerable, но и ITreeNodeModel вместо типа, его реализуюего. Т. е. не только нельзя, чтобы Children возвращал это List<Quest> но и это List<ITreeNodeModel> и это IEnumerable<Quest> А как же приведение типов? Такое ощущение, что приведение типов работает в runtime, но не в designtime. Потому что внутри свойства Children я могу вернуть List<Quest>: return List<Quest> и всё будет нормально. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 07:27 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
А ещё заметил такое ограничение, что если я наследую public class NodedQuest_VM : Noded_VM в таком дизайне Noded_VM, как у меня , нельзя будет в XAML привязать ни одного свойства из NodedQuest_VM, если шаблон данных работает со свойством Children типа Noded_VM. Можно как-то обойти это, чтобы Children родительского класса возвращал коллекцию объектов типа потомкового класса? Пока думаю снова с параметром типов, но боюсь, что слишком при этом всё усложнится. Щас попробую... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 07:34 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Пока сделал вот так, но пишет ошибку в строчке, что я обозначил Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
Если добавить new(): Код: c# 1.
то получаю в этой же строчке следующую ошибку 'T': cannot provide arguments when creating an instance of a variable type ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 08:01 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Что-то как-то заморочено с этим тривью. Неужели никто не сделал универсальный контейнер для treeview node? Чтобы можно было любой тип в этот контейнер помещать и получать функциональность узла в дереве. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 08:03 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Если кому интересно, я тут создал такой же вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 08:41 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Пока только вот что придумал: надо в эту универсальную модель представления для узла добавлять всякие свойства для кастомизации. Например, DisplayName для отображения названия узла в дереве. Если чего посложнее надо - тоже добавить эти сложные свойства в эту универсальную модель. Получается, что эта универсальная модель раздуется из-за этих расширений до невозможности. А я хочу получать функциональность не таким раздуванием, а наследованием или ещё каким простым способом. Так, чтобы каждый кирпичик этих функциональностей содержал в себе только свою функциональность, а не кучу кода поддержки расширений. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 09:08 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
авторНапример, DisplayName для отображения названия узла в дереве. Если чего посложнее надо - тоже добавить эти сложные свойства в эту универсальную модель. Я имед ввиду, а что, если я хочу не просто название в узле отображать, а некую сложную конструкцию? Придётся городить дополнительное свойство для отображения этой сложной конструкции... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 09:10 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
А, щас ещё раз взглянул на пример Джоша Смита . Во втором варианте, где у него города, штаты и прочее в дереве, у него как раз и есть базовая модель представления. Моя ошибка в том, что я сделал загрузку детей в этой же базовой модели, а он сделал метод загрузки виртуальным и предоставил потомковым моделям самим определять, как будут загружаться дети. Это позволяет отказаться от интерфейса со свойством, реализующим загрузку детей. Но, с другой стороны, это заставляет потомковые модели представления быть толще, чем они могли бы быть. Вобщем, у Джоша Смита подход лучше. Его и буду использовать. Мой вариант настолько универсальный, что его реализация будет либо невозможной, либо чрезмерно громоздкой - всё из-за загрузки детей. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 09:19 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Есть универсальный родной TreeViewItem, как часть родной content model WPF. Накой лепить ещё одну универсальную абстракцию? Бинди его на конкретную ViewModel и радуйся жизни. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 09:57 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
user7320Вобщем, у Джоша Смита подход лучше. Его и буду использовать. Мой вариант настолько универсальный, что его реализация будет либо невозможной, либо чрезмерно громоздкой - всё из-за загрузки детей.У Джоша Смита подход так себе. Для загрузки детей дерева нужен аналог Lazy<T> с реализацией INotifyPropertyChanged. Вот моя асинхронная реализация. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 10:07 |
|
Универсальная модель представления для узла TreeView
|
|||
---|---|---|---|
#18+
Алексей Кuser7320Вобщем, у Джоша Смита подход лучше. Его и буду использовать. Мой вариант настолько универсальный, что его реализация будет либо невозможной, либо чрезмерно громоздкой - всё из-за загрузки детей.У Джоша Смита подход так себе. Для загрузки детей дерева нужен аналог Lazy<T> с реализацией INotifyPropertyChanged. Вот моя асинхронная реализация. У Джоша ленивая загрузка. Я только с твоим async не понял, как она реализуется. Через другой поток? А если асинк не нужен, то всё нормально? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2014, 10:18 |
|
|
start [/forum/topic.php?fid=21&msg=38631597&tid=1441130]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 175ms |
0 / 0 |