ComboBox itemsSource和默认选择的值不起作用

时间:2013-08-17 17:06:41

标签: wpf xaml

我有这段代码:

<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之前,项目集合必须为空。

我该怎样处理这个问题所以我也会得到所有的工人,还有项目 - “选择”作为组合框的第一项?

非常感谢:)

2 个答案:

答案 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}}" />