powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многомерная ObservableCollection<T>
5 сообщений из 5, страница 1 из 1
Многомерная ObservableCollection<T>
    #38325483
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для простоты пусть будет двухмерная. Т. е. двухмерный массив. Т. е. матрица.

Отслеживать (обозревать) надо изменение элементов в коллекции. Отслеживать изменение количества столбцов или строк не нужно. Как лучше реализовать?

Варианты.

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 для обычного двухмерного списка реализовать?
...
Рейтинг: 0 / 0
Многомерная ObservableCollection<T>
    #38326445
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, немного переписал пример по ссылке выше. Жаль, что не получилось класс 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.
public class Observable2DimensionCollection<Tx, Ty, T> : ObservableCollection<MyTuple<Tx, Ty, T>>
{
	public T this[Tx x, Ty y]
	{
		get
		{
			return this.FirstOrDefault<MyTuple<Tx, Ty, T>>(
				tuple => 
					tuple.XCoord.Equals(x) && 
					tuple.YCoord.Equals(y)).Value;
		}

		set
		{
			this.FirstOrDefault<MyTuple<Tx, Ty, T>>(
				tuple => 
					tuple.Equals(x) && 
					tuple.YCoord.Equals(y)).Value = value;
		}
	}
}

public class MyTuple<Tx, Ty, T>
{
	public Tx XCoord { get; set; }
	public Ty YCoord { get; set; }
	public T Value { get; set; }

	public MyTuple(Tx xCoord, Ty yCoord, T value)
	{
		this.XCoord = xCoord;
		this.YCoord = yCoord;
		this.Value = value;
	}
}




Кто что может сказать? Какие минусы у этого могут быть?
...
Рейтинг: 0 / 0
Многомерная ObservableCollection<T>
    #38326449
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хотел сделать, чтобы для внешнего пользователя она работала как двухмерный массив с возможностью сохранять данные в нём (ну и с функциональностью ObservableCollection, конечно). Т. е. чтобы никаких Tuple в типе возврата, а только тот тип возвращался, который в ней хранится.
...
Рейтинг: 0 / 0
Многомерная ObservableCollection<T>
    #38326455
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигасе! Узнал сейчас, что, оказывается, у типа может быть столько индексируемых свойств, сколько индексов. В частности, в моей коллекции можно обращаться к её элементам как collection[index], так и collection[index1, index2].

Как запретить первый вариант?
...
Рейтинг: 0 / 0
Многомерная ObservableCollection<T>
    #38326947
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем, как я понял, придётся смириться с тем, что моя двухмерная коллеция будет "светить" методами лежащей в основе одномерной коллеции. Иначе пришлось бы вообще с нуля свою коллецию реализовывать. Но для этого бы пришлось бы писать и логику энумераторов к ней (для двухмерной-то) и прочее. А с другой стороны, мне для двухмерной коллеции по-прежнему нужна функциональность одномерной (чтобы тупо методом Add данные добавлять). Так что пусть лучше остаётся такая простая обёртка, которая просто добавляет возможность обращаться к элементам коллеции через два индекса, а не только через один.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многомерная ObservableCollection<T>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]