0

我有这个代码:

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

我该如何处理,所以我将获得所有的工人,以及项目 - “选择”作为组合框的第一项?

非常感谢 :)

4

2 回答 2

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

正如@HB 指出的那样,BindingonCollectionContainer不会以这种方式工作。你有几个选择。这篇CodeProject文章已经为您详细说明了它们,所以我不会在这里重复它们。没有提到的一种方法是新的(从 .NET 4 开始)x:Reference选项。它将像这样使用:

<CollectionContainer Collection="{Binding DataContext.Workers, Source={x:Reference cbxWorkers}}" />
于 2013-08-17T17:21:59.207 回答
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 中创建一个额外的第一个项目并确保它被选中。

于 2013-08-17T17:12:20.950 回答