向有界组合框添加空项

本文关键字:添加 组合 | 更新日期: 2023-09-27 18:17:22

我需要在wpf mvvm应用程序中的有界组合框中添加一个空项,我尝试了这个

<ComboBox TabIndex="23"  Text="{Binding Specialisation}" DisplayMemberPath="refsp_libelle">
      <ComboBox.ItemsSource>
                          <CompositeCollection >
                                        <ComboBoxItem  > </ComboBoxItem>
                                        <CollectionContainer  Collection="{Binding SpecialisationItemSource}" ></CollectionContainer>
                       </CompositeCollection>
     </ComboBox.ItemsSource>
  </ComboBox>

在我尝试添加空项之前,它已经工作了。

<ComboBox TabIndex="23" Text="{Binding Specialisation}" ItemsSource="{Binding SpecialisationItemSource}" DisplayMemberPath="refsp_libelle"/>

所以我需要知道:

  1. 我犯的错误是什么?
  2. 我该如何修复它?

谢谢,

向有界组合框添加空项

为什么你的方法不起作用?

您使用{Binding SpecialisationItemSource},由于没有显式定义绑定的源,因此退回到使用目标的DataContext作为源-或者更确切地说,如果CollectionContainerFrameworkElement,则它不是。因此,绑定的源是null,组合中没有显示任何项。您需要显式地设置绑定的Source属性才能使其工作(设置RelativeSourceElementName也不会工作)。

实际上,即使 CollectionContainer FrameworkElement 它仍然不会工作,因为 CompositeCollection 不是 FrameworkElement (它甚至不是 DependencyObject ),所以数据上下文继承将被打破)。

如何修复?

为了使用"隐式绑定",您可以在资源字典中放置CollectionViewSource,并使用StaticResource扩展来填充集合容器:

<ComboBox>
    <ComboBox.Resources>
        <CollectionViewSource x:Key="Items" Source="{Binding SpecialisationItemSource}" />
    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <TextBlock />
            <CollectionContainer Collection="{Binding Source={StaticResource Items}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

请注意,我使用了Collection="{Binding Source={StaticResource Items}}"而不是Collection="{StaticResource Items}"——这是因为CollectionViewSource类型的对象不是一个实际的集合,也不是CollectionContainer.Collection属性的有效值,绑定机制被设计成将其转换为一个实际的集合。另外,我用一个空的TextBlock替换了一个空的ComboBoxItem,因为前者会导致绑定错误,这是我非常不喜欢看到的。最后,我甚至会将其替换为绑定集合的项类型的默认值。