2011-12-23 87 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綁定到集合的默認視圖