我有这段代码:
<ComboBox Name="cbxWorkers" HorizontalContentAlignment="Right"
ItemsSource="{Binding Workers}">
<ComboBoxItem IsSelected="True" Content="Select" />
<ComboBox.ItemTemplate>
<DataTemplate>
<ComboBoxItem Content="{Binding LastName}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
除了第二行外,一切正常。 它给了我一个运行时异常: 在使用ItemsSource之前,项目集合必须为空。
我该怎样处理这个问题所以我也会得到所有的工人,还有项目 - “选择”作为组合框的第一项?
非常感谢:)
答案 0 :(得分:0)
您无法拥有两个来源。您必须在ItemsSource中的代码中指定要选择的项目。
<ComboBox Name="cbxWorkers" HorizontalContentAlignment="Right" ItemsSource="{Binding Workers}">
<ComboBox.ItemTemplate>
<DataTemplate>
<ComboBoxItem Content="{Binding LastName}" IsSelected="{Binding isSelected}" />
</DataTemplate>
</ComboBox.ItemTemplate>
您可以这样做,或者您可以在C#/ VB中添加一个额外的第一项,并确保它已被选中。
答案 1 :(得分:0)
您可以使用CompositeCollection
:
<ComboBox x:Name="cbxWorkers" SelectedIndex="0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=LastName}" />
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem Content="Select" />
<CollectionContainer Collection="{Binding Workers}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
注意:您需要在SelectedIndex="0"
上设置ComboBox
,因为当ComboBoxItem
位于ItemsSource
时,其IsSelected
属性不会在ComboBox
上设置选择。
关于CollectionContainer
作为@ H.B。指出,Binding
CollectionContainer
不会以这种方式运作。你有几个选择。这篇CodeProject文章为您详细说明了这些内容,因此我在此不再赘述。没有提及的一种方法是newish(从.NET 4开始)x:Reference
选项。它会像这样使用:
<CollectionContainer Collection="{Binding DataContext.Workers, Source={x:Reference cbxWorkers}}" />