Что мне не хватает? - PullRequest
       1

Что мне не хватает?

0 голосов
/ 23 декабря 2011

Я получил этот код из WPF (очень простого) приложения, которое иллюстрирует мою проблему:

public MainWindow()
{
    InitializeComponent();

    ObservableCollection<string> myColl = new ObservableCollection<string>();
    myColl.Add("1");
    myColl.Add("2");

    listBox1.ItemsSource = myColl;
}

Это работает!

Но потом я получил это:

List<object> obj = new List<object>();
obj.Add(listBox1.ItemsSource);
obj[0] = myColl;

это не работает, и проблема, кажется, заключается в том, что ItemSource списка элементов имеет значение «null», поэтому в моем списке я получил значение «null» и его нет в живых, объект «потерян».Что же мне нужно изменить, чтобы «действительно» получил ItemSource моего списка в моем списке, а не его значение?

(ps: я знаю, что для многих из вас это будет нубским вопросом, но я не могу найтичто мне не хватает, даже если я чувствую, что это просто ..)

РЕДАКТИРОВАТЬ: мой список с объектами, потому что мне придется обрабатывать различные типы коллекций (списки, ObservableCollections и IEnumerable)

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Ваша ошибка в данном случае заключается в том, что содержимое listBox1.ItemSource является указателем или другой ссылкой на ваш ObservableCollection<string> myColl. Это не тот случай.

listBox1.ItemSource используется для привязки данных listBox1 к содержимому myColl (в вашем случае), но, как указано в MSDN:

WPF никогда не связывается напрямую с коллекцией. Если вы укажете коллекцию в качестве источника привязки, WPF фактически привязывается к коллекции по умолчанию вид

0 голосов
/ 23 декабря 2011

В строке obj.Add(listBox1.ItemsSource) хранится текущее значение listBox1.ItemsSource - очевидно, что оно равно нулю - в obj[0] (или следующем элементе в списке, если он не пустой).

Строка obj[0] = myColl затем перезаписывает это нулевое значение со ссылкой на myColl. Это никак не влияет на listBox1.ItemsSource, потому что вы не сохранили никаких ссылок на listBox1.ItemsSource - только то, что было значением этой ссылки.

Если вы хотите достичь того, что пытаетесь сделать, вам нужно сделать что-то вроде следующего:

List<Action<object>> obj = new List<Action<object>>();
obj.Add(o => listBox1.ItemsSource = o);
obj[0](myColl); 

Здесь хранится список действий, первым из которых является «назначить данное значение listBox1.ItemsSource», а затем вызывается это действие с коллекцией. (Это должно подражать тому, что вы ожидали, что ваш код будет делать выше, но это немного обходится - несомненно, есть более простой способ достичь любой более широкой цели, которую вы ставите.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...