我错过了什么?

时间:2011-12-23 09:12:00

标签: c# wpf data-binding

我从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 个答案:

答案 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”,然后使用该集合调用该操作。 (这应该模仿你对上面代码的期望,但它有点反复无常 - 无疑是一种更简单的方法来实现你拥有的更广泛的目标。)