2009-09-08 84 views
0

我有一個列表框,需要至少一個組合框。我找不到在我使用的ItemTemplate中放置ComboBox的方法。Silverlight:如何動態綁定ListBox ItemTemplate中的ComboBox?

... 
<DataTemplate x:Key="parts_template"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock .../> 
    <ComboBox .../> 
    </StackPanel> 
</DataTemplate> 

... 
<ListBox x:Name="lb_parts" ItemTemplate="{StaticResource parts_template}" .../> 
... 

如何將DataTemplate中的ComoBox綁定到代碼後面的ObservableCollection?

+0

你的代碼沒有通過 - 你能解決它嗎? – 2009-09-08 17:53:22

+0

修復了代碼。需要添加4個空格縮進。 – James 2009-09-08 18:31:30

回答

3

另一件事你可以嘗試訂閱ComboBox上的Loaded事件。 然後,您可以將EventHandler中的ComboBox.ItemsSource設置爲MyObservableCollection。

看一看

XAML:

<DataTemplate x:Key="parts_template"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock .../> 
    <ComboBox Loaded="ComboBox_OnLoaded"> 
     <!-- ComboBox ItemTemplate --> 
    </ComboBox> 
    </StackPanel> 
</DataTemplate> 

C#代碼背後:

private void ComboBox_OnLoaded(object sender, EventArgs e) 
{ 
    ((ComboBox)sender).ItemsSource = MyObservableCollection; 
} 
+0

這應該適用於一個簡單的場景,其中項目源的集合在頁面的生命週期中不會更改。 問題在於,列表框中的每個項目都會觸發Loaded事件。我必須打電話給服務器來填充集合。由於組合框中使用的數據取決於屏幕上的另一個字段,並且當用戶更改該值時,我需要更改該下拉列表中的內容。這意味着對服務器的調用次數與列表框中的項目數量相同,儘管我會對相同的內容進行相同的調用。 – James 2009-09-09 18:43:18

+0

您何時調用服務器來填充ObservableCollection。 在我上面的例子中,這只是將ComboBox ItemsSource設置爲ObservableCollection。無論何時您選擇更新Colletion都無關緊要,因爲ComboBox將收到任何更改的通知並將其反映在其項目中。 目前他們都共享相同的ObservableCollection - 如果這不是你想要的,那麼這個解決方案不適合你,因爲你說的原因。 希望這是有道理的。 – Eoinii 2009-09-10 07:19:35

+0

是的,它確實有效。當其他字段發生變化時只設置一次收集,並在Loaded事件中分配收集。 我希望我只能引用xaml中的另一個模板。 – James 2009-09-10 15:31:26

0

好的,這裏是你如何添加一個ComboBox到後臺代碼中的ListBox。

創建一個ComboBox

ComboBox x = new ComboBox(); 

如果您有填充組合框數據源,那麼你可以只綁定該

x.ItemsSource = e.Result; 

如果不這樣做,並希望手動項目添加到組合框:

ComboBoxItem y = new ComboBoxItem(); 

將項目的內容設置爲您想在ComboBox中顯示的內容

y.Content = "Hello"; 

現在所有剩下的,是對ComboBoxItem組合框添加到組合框(僅當您手動創建項目),然後到ListBox

x.Items.Add(y); 

//testing is my ListBox 
testing.Items.Add(x); 
+0

還沒有嘗試過,但我不想在代碼中創建組合框本身。 – James 2009-09-09 22:17:45

0

你應該能夠在數據上下文設置列表本身

lb_Parts.DataContext=myCollection;

然後你應該能夠綁定到它的模板

<DataTemplate x:Key="parts_template"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock .../> 
    <ComboBox ItemSource={Binding}/> 
    </StackPanel> 
</DataTemplate> 
+0

我沒有明白。那個集合會是怎樣的?假設列表框有一個文本塊,一個複選框和一個組合框。現在我有一個類型爲x的集合,它有一個布爾值和兩個文本字段。 – James 2009-09-10 15:38:13

相關問題