|
Многомерная ObservableCollection<T>
|
|||
---|---|---|---|
#18+
Для простоты пусть будет двухмерная. Т. е. двухмерный массив. Т. е. матрица. Отслеживать (обозревать) надо изменение элементов в коллекции. Отслеживать изменение количества столбцов или строк не нужно. Как лучше реализовать? Варианты. 1. Посмотреть в реализацию ObservableCollection<T> и сделать "как у них". Т. е. реазиловать интерфейсы INotifyCollectionChanged, INotifyPropertyChanged и, возможно, унаследовать от Collection<T>. В основе при этом будет лежать двухмерный массив вида Array[,]. Плюсы - можно наворотить столько функционала, что... Ну, и ещё доступ к элементам коллекции через индексы. Минусы - долго, муторно, непонятно (для меня). 2. Сделать через кортеж http://stackoverflow.com/a/1169350 , только поменять public class MyTupleList : List<Tuple<string, string, string>> на public class My2DimObservableCollection : ObservableCollection<Tuple<T, int, int>> Плюсы - как раз решает задачу "отслеживание только изменения элементов", без отслеживания изменения столбцов и строк; ничего реализовывать не надо, т. к. используется готовая ObservableCollection<T>. Минусы - пока ещё не знаю, получится ли. Например, строчку с унаследованием от ObservableCollection<T> написал "от балды" - сработает ли, не знаю. Да и, честно говоря, не уверен, что нужна функциональность именно ObservableCollection<T>, т. к. менять количество элементов динамически в матрице не требуется. 3. Может, есть где готовые варианты? А то Гугл выдаёт какие-то дурацкие варианты, типа "список в списке" или "словарь в словаре" - это какие-то плохие костыли. ...Ах, да. Зачем мне это нужно. - Хочу сделать сетку с объектами и чтобы можно было объекты менять (поэтому и Observable). В том числе удалять из сетки или заменять на другие, а также свойства этих объектов. Но сами размеры сетки менятся динамически не будут - только задаётся размер при создании сетки. Для этого обязательно нужно INotifyCollectionChanged, или достаточно INotifyPropertyChanged для обычного двухмерного списка реализовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2013, 13:40 |
|
Многомерная ObservableCollection<T>
|
|||
---|---|---|---|
#18+
Вот, немного переписал пример по ссылке выше. Жаль, что не получилось класс MyTuple сделать nested, чтобы всю функциональность сохранить в одном классе - ObservableCollection не видит класс MyTuple, когда тип данных ей указываешь. Код: 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.
Кто что может сказать? Какие минусы у этого могут быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2013, 11:10 |
|
Многомерная ObservableCollection<T>
|
|||
---|---|---|---|
#18+
Я хотел сделать, чтобы для внешнего пользователя она работала как двухмерный массив с возможностью сохранять данные в нём (ну и с функциональностью ObservableCollection, конечно). Т. е. чтобы никаких Tuple в типе возврата, а только тот тип возвращался, который в ней хранится. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2013, 11:13 |
|
Многомерная ObservableCollection<T>
|
|||
---|---|---|---|
#18+
Фигасе! Узнал сейчас, что, оказывается, у типа может быть столько индексируемых свойств, сколько индексов. В частности, в моей коллекции можно обращаться к её элементам как collection[index], так и collection[index1, index2]. Как запретить первый вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2013, 11:18 |
|
Многомерная ObservableCollection<T>
|
|||
---|---|---|---|
#18+
Вобщем, как я понял, придётся смириться с тем, что моя двухмерная коллеция будет "светить" методами лежащей в основе одномерной коллеции. Иначе пришлось бы вообще с нуля свою коллецию реализовывать. Но для этого бы пришлось бы писать и логику энумераторов к ней (для двухмерной-то) и прочее. А с другой стороны, мне для двухмерной коллеции по-прежнему нужна функциональность одномерной (чтобы тупо методом Add данные добавлять). Так что пусть лучше остаётся такая простая обёртка, которая просто добавляет возможность обращаться к элементам коллеции через два индекса, а не только через один. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2013, 15:25 |
|
|
start [/forum/topic.php?fid=20&msg=38326455&tid=1404384]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 332ms |
total: | 501ms |
0 / 0 |