【问题标题】:Add an empty item to a bounded combobox向有界组合框添加一个空项目
【发布时间】:2015-10-13 12:00:54
【问题描述】:

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

谢谢,

【问题讨论】:

  • MVVM:模型提供了一个列表 (List),ViewModel 向它添加了空白项 (List + default() -> ObservableCollection) 然后出现在视图中(正常绑定)。 CompositeCollection(在 msdn 上查看示例)用于将静态集合绑定为一个。普通绑定是tricky

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


【解决方案1】:

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

您使用{Binding SpecialisationItemSource},因为没有明确定义绑定的源,所以回退到使用目标的DataContext 作为源——或者更确切地说,如果CollectionContainerFrameworkElement,则它不是FrameworkElement。因此,绑定的来源是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,因为前者导致绑定错误,我真的不喜欢看到。最终,我什至会用绑定集合的项目类型的默认值替换它。

【讨论】:

  • 我不明白你所说的“不是框架元素”是什么意思。
  • @Vidar 我不是说它不是源自FrameworkElement class
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多