将空项添加到有界组合框中

时间:2015-10-13 12:00:54

标签: c# .net wpf mvvm model-binding

我需要在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. 我该如何解决?
  3. 感谢,

1 个答案:

答案 0 :(得分:5)

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

您使用{Binding SpecialisationItemSource},因为没有明确定义绑定的来源,所以回退到使用目标DataContext作为来源 - 或者更确切地说,如果CollectionContainerFrameworkElement,而不是。null。因此,绑定的来源是Source,并且组合中不显示任何项目。您需要明确设置绑定的RelativeSource属性才能使其正常工作(设置ElementNameCollectionContainer也不会起作用。)

实际上,即使 FrameworkElement CompositeCollection ,它仍然无效,因为 {{1} } 不是 FrameworkElement (它甚至不是 DependencyObject ),因此数据上下文继承会被破坏)。

如何解决?

为了使用&#34;隐式绑定&#34;,您可以在资源字典中放置CollectionViewSource,并使用StaticResource扩展名来填充集合容器:< / p>

<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类型的对象不是实际的集合,并且不是{{{1}的有效值1}}属性,绑定机制旨在将其转换为实际集合。另外,我用空CollectionContainer.Collection替换了空ComboBoxItem,因为前者导致绑定错误,我真的不喜欢看到。最终,我甚至会用绑定集合的项目类型的默认值替换它。