2011-12-23 5 views
0

Я получил этот код из 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 в окне списка является «нулевым», поэтому в моем списке я получил «нуль» и его мертвым, объект потерян". Что мне нужно изменить, чтобы «действительно» получил элемент ItemSource в моем списке, а не его значение?

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

EDIT: мой список это с объектами, потому что я должен буду обрабатывать различные типы коллекций (списки, ObservableCollections и IEnumerable)

+0

Что другие элементы вашего списка 'obj' будет использоваться? Применять 'myColl' в другие списки ListBoxes? Применять другие коллекции в 'listBox1'? – Rawling

+0

Это будут другие ObservableCollections и IEnumerables, которые должны будут получить значение «myColl»! –

+2

Этот код пахнет очень плохо. Я бы предложил еще раз взглянуть на то, что вы пытаетесь достичь - действительно ли вам нужно составить список источников товаров? У вас уже есть ObservableCollection строк - не можете ли вы просто добавить это в свой список? Но опять же - ты действительно хочешь это делать? Я предлагаю, возможно, начать еще один вопрос о том, что вы на самом деле пытаетесь достичь, поэтому люди могут предложить лучшие решения для достижения вашей цели. –

ответ

0

линии 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 ", а затем вызов этого действия с помощью коллекции. (Это должно эмулировать то, что вы ожидали от своего кода выше, но это немного rounabout - есть, несомненно, более простой способ достичь любой более широкой цели, которую вы имеете.)

+0

У Hum появилась идея, но для этого нужно было скомпилировать «obj.Add (o => listBox1.ItemsSource = o как IEnumerable); но все будет в порядке с ObservableCollections? –

+0

@GuillaumeSlashy - вы могли бы сделать 'obj' a' List > ', который был бы более безопасным для типов. И ObservableCollection реализует IEnumerable, так что это должно быть хорошо. – Rawling

1

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

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

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

Смежные вопросы