2009-09-08 81 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

相关问题