我从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)
答案 0 :(得分:1)
这里的错误是假设listBox1.ItemSource
的内容是指向您ObservableCollection<string> myColl
的指针或其他引用。事实并非如此。
listBox1.ItemSource
用于将listBox1
数据绑定到myColl
的内容(在您的情况下),但正如MSDN中所述:
WPF永远不会直接绑定到集合。如果指定集合 作为绑定源,WPF实际上绑定到集合的默认值 图
答案 1 :(得分: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
”,然后使用该集合调用该操作。 (这应该模仿你对上面代码的期望,但它有点反复无常 - 无疑是一种更简单的方法来实现你拥有的更广泛的目标。)