2010-08-18 59 views
2

由於某些原因,我必須在代碼後面初始化ListBox項目,原因太複雜了。如何在代碼後面創建ListBoxItem

在WPF UserControl顯示期間調用LoadFamily()。

public void LoadFamily() 
{ 
    DataTemplate listItemTemplate = this.FindResource("ManDataTemplate") as DataTemplate; 

    foreach (Person man in family) 
    { 
     ListBoxItem item = new ListBoxItem(); 

     item.DataContext = man; 
     item.ContentTemplate = listItemTemplate; 
     // other initialize for item object 
     this.ActivityList.Items.Add(item); 
    } 
} 

在我的xmal文件中,我定義了一個DataTemplate。

<DataTemplate x:Key="ManDataTemplate" DataType="{x:Type local:Person}"> 
    <TextBlock Text="{Binding Path=Name}"/> 
</DataTemplate> 

但是ListBox只包含空的文本塊,人的名字不顯示。我不知道爲什麼,也許數據綁定是錯誤的,但是如何在代碼後面做到這一點。

感謝您的任何幫助! (WPF 3.5或4.0)

/////////////////// //////////////////////

感謝您的幫助。我發現我錯了。 我不應該將ListBoxItem添加到ActivityList.Items中,一個是UIElement,另一個是> DataCollection。他們是兩回事。

我應該修改代碼如下:

foreach (Person man in family) 
{ 
    this.ActivityList.Items.Add(man); 
    ListBoxItem item = this.ActivityList.ItemContainerGenerator.ContainerFromItem(man) as ListBoxItem; 
    item.ContentTemplate = listItemTemplate; 
    // other initialize for item object 
} 

回答

0

可能存在綁定錯誤。這就是textblock爲空的原因。檢查VisualStudio的輸出窗口,如果存在綁定錯誤,它將顯示綁定錯誤。

HTH

+0

在仔細檢查Output之後,我發現了錯誤的地方。我的問題,謝謝。 – 2010-08-19 03:11:04

1

我沒有看到手動創建listboxitems的利益。只需將Listbox的ItemsSource設置爲人員(家庭)的列表。

+0

好處隱藏在/ /其他初始化項目對象,我註釋掉。那裏有太多的代碼。 :( – 2010-08-18 09:55:44

+1

我仍然認爲最好將ListBox的ItemsSource設置到列表中,然後從XAML中使用你的數據模板,然後它會自動爲每個Item使用正確的DataContext,將Name屬性讀入 – 2010-08-18 11:25:44

+0

我試着按照你的說法,這花了我一些時間,我必須將很多代碼轉換成xmal,這對其他人來說太難理解了。 – 2010-08-19 02:34:56

相關問題