Вот рабочий пример:
static void Main(string[] args)
{
List<string> a = new List<string>();
List<string> b = a;
a.Add("1");
b.Add("2");
Console.WriteLine(a.Count().ToString() + " " + a[0]);
Console.WriteLine(b.Count().ToString() + " " + b[0]);
Console.ReadKey();
}
Вот не рабочий пример:
static void Main(string[] args)
{
List<string> a = new List<string>();
ObservableCollection<string> b = new ObservableCollection<string>(a);
a.Add("1");
b.Add("2");
Console.WriteLine(a.Count().ToString() + " " + a[0]);
Console.WriteLine(b.Count().ToString() + " " + b[0]);
Console.ReadKey();
}
Резюме:
Во втором варианте каждая переменная выводит только свои значения, в отличии от первого варианта, где каждая переменная выводит все значения.
Проблема:
Мне необходимо передать ссылку List'а ObservableCollection'у и получать все значения List'а через ObservableCollection. Также в случае редактирования ObservableCollection, что бы редактировался List.
Проще говоря нужно в итоге получить первый вариант, но принимающая переменная должна быть ObservableCollection.
Очень не хотельсь бы городить что то большой через события и свойства.
Вопросы:
Почему это не работает?
Возможно ли передать переменной ObservableCollection ссылку на переменную List.
Возможно ли как-нибуть это вообще реализовать?
Как уже ответил Igor:
В первом случае List b
лишь ссылается на List a
, поэтому по сути в обоих случаях вы работаете с одним экземпляром списка, куда добавляете и откуда выводите.
Во втором, ObsevableCollection b
и List a
имеют свои независимые экземпляры, а инициализируя, как это делаете вы, в b
лишь копируются текущие элементы a
. Причём нужно понимать, что для структур идёт копирование, а для классов лишь ссылка на экземляр копируется.
Ссылку передать нельзя. В реализации этих классов такой функции нет.
В вашем случае нельзя.
Причина проста: List
не имеет возможности хоть как-то уведомлять об изменении. Даже если вы захотите написать какой-то свой класс, то вы просто не сможете узнавать, изменился ли List
или нет.
Что именно вы хотите реализовать не совсем понятно, поэтому подсказать трудно, но может в данном случае помочь BindingList. Уже с ним вы сможете написать свой класс, который будет связывать ObsevableCollection
и BindingList
, но опять же - базовой реализации нет.
Дополнение:
Если очень хочется и ObservableCollection и List, то пишите отдельный метод:
List<string> a = new List<string>();
ObservableCollection<string> b = new ObservableCollection<string>();
void Add(string newstring)
{
a.Add(newstring);
b.Add(newstring);
}
Можно и отдельный класс для этого написать, где будут все основные команды присутствовать (Clear, Remove, Insert). Но тогда все изменения нужно будет проводить только через этот вспомогательный класс. И если вдруг какой-нибудь из списков изменится где-нибудь не в этом классе, то об этом вы уже не узнаете.
где каждая переменная выводит все значения.
Потому что в первом примере a
и b
ссылаются на один и тот же объект.
Bторой пример аналогичен не
List<string> a = new List<string>();
List<string> b = a;
а
List<string> a = new List<string>();
List<string> b = new List<string>(a);
где a
и b
разные списки, которые ничего не знают о добавлении элементов друг в друга.
Вас не устроит общий интерфейс ICollection<T>
?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть ли какой-либо мануал более вменяемый чем официальная документация?