2011-12-23 89 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; 

这不工作,问题似乎是ListBox的的ItemSource为“null”,所以在我的名单,我得到“空”和它死了,对象是“迷失”。 是什么让我必须改变为“真正”我的列表框的ItemSource在我的列表中,而不是它的值?

(PS:我知道这将是一个很大的你一个noob问题,但我不能找到我丢失的,即使我觉得它很简单..)

编辑:我的名单与对象,因为我将不得不处理不同类型的集合(列表,ObservableCollections和IEnumerable)

+0

什么将您的列表'的其它元素obj'可以用来做什么?将myColl应用于其他ListBox?将其他集合应用于'listBox1'? – Rawling 2011-12-23 09:40:08

+0

这将是其他ObservableCollections和IEnumerables将必须收到“myColl”值! – 2011-12-23 09:46:02

+2

此代码闻起来非常糟糕。我建议再看看你想达到的目标 - 你是否真的需要制作一个itemssources列表?你已经有了一个字符串的ObservableCollection - 你能不能把它添加到你的列表中呢?但是,再一次 - 你真的想要这样做吗?我建议可能会开始另一个问题,说明你实际上想要达到的目标,这样人们可以提出更好的解决方案来实现你的目标。 – 2011-12-23 09:47:42

回答

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“,然后用集合调用该操作。 (这应该效仿你期望你的代码做什么,但这有点让人满意 - 无疑有一个更简单的方法可以实现你拥有的更广泛的目标。)

+0

嗡嗡声得到了想法,但为此编译我不得不做“obj.Add(o => listBox1.ItemsSource = o作为IEnumerable);”但ObservableCollections会好吗? – 2011-12-23 09:30:25

+0

@GuillaumeSlashy - 你可以改为使'obj'成为一个'List >',这样会更安全。 ObservableCollection实现IEnumerable,所以应该没问题。 – Rawling 2011-12-23 09:36:41

1

你的错误在这里假设listBox1.ItemSource的内容是一个指针或其他对您的ObservableCollection<string> myColl的引用。不是这种情况。

listBox1.ItemSource用于数据绑定listBox1myColl内容(你的情况),但在MSDN指出:

WPF从来没有直接绑定到一个集合。如果指定的集合 作为绑定的源,实际上WPF绑定到集合的默认视图