【问题标题】:How to merge two sources in a Collection and show them correct in a combobox?如何合并集合中的两个源并在组合框中正确显示它们?
【发布时间】:2018-05-03 15:03:50
【问题描述】:

我有一些 XAML 代码让我很生气。首先是为未引用的值添加一个虚拟项目。

为此,我必须实现 CollectionViewSourceCompositeCollection。 现在我无法选择第一个 Combobox 项,它出现但我无法选择它,因为我在 XAML 中设置了DisplayMemberPath(我猜是这样)。分隔符看起来也不像预期的那样。

让我告诉你:



如果我不设置 XAML DisplayMemberPath,我可以使用 Dummy Item 但绑定的项目显示不正确:

XAML:

<ComboBox x:Name="G_cb_content_zuordnung" 
          Margin="165,0,0,0" 
          Grid.Row="1" 
          SelectedIndex="0"
          VerticalAlignment="Top"
          DisplayMemberPath="PartnerID"
          HorizontalAlignment="Left" 
          Width="119">
    <ComboBox.Resources>
        <CollectionViewSource x:Key="ComboCollection" Source="{Binding Path=mySelectedItem.Stammkinder}" />
    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="Ohne Stammnummer" Name="NoPID" />
            <Separator />
            <CollectionContainer Collection="{Binding Source={StaticResource ComboCollection}, Mode=OneWay}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

我只需要一个显示在ObservableCollection&lt;myClass&gt; 顶部的虚拟/占位符组合框项目。难道我的思维方式不对?有更聪明的解决方案吗?我的解决方案是否遗漏了什么?

【问题讨论】:

  • 我不确定“虚拟项目”的用途是什么,但看起来您正试图让组合框以不同于设计的方式运行。这通常非常困难。一般来说,创建 UI 通常很困难。我建议您在代码隐藏中创建一个带有逻辑的 UserControl 来管理虚拟项目(UI 逻辑在代码隐藏中,不要认为这不是 mvvm),完全放弃这个概念,或者在那里找到一个不同的组合控件以你想要的方式行事。
  • 它在后台与我的 Viewmodel 链接,如果我选择一个值,则应修改或覆盖现有值。如果选择了虚拟字段,它应该会导致在我的 Viewmodel 中创建一个新对象。最后,它是一个简单的“切换”——并不少见。

标签: c# wpf mvvm data-binding compositecollection


【解决方案1】:

使用第二种方法并为项目明确定义DataTemplate,而不是使用DisplayMemberPath 属性:

<ComboBox xmlns:o="clr-namespace:APP.GLN_Organisator.Objects">
    <ComboBox.Resources>
        <CollectionViewSource x:Key="ComboCollection"
                              Source="{Binding Path=mySelectedItem.Stammkinder}" />

        <!-- Define a DataTemplate here -->
        <DataTemplate DataType="{x:Type o:ChildPartner}">
            <TextBlock Text="{Binding PartnerID}"/>
        </DataTemplate>

    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="Ohne Stammnummer" Name="NoPID" />
            <Separator />
            <CollectionContainer Collection="{Binding Source={StaticResource ComboCollection}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

使用DataTemplate,您可以告诉 WPF 您希望如何显示您的项目。如果您未提供任何 DataTemplate 并且未设置 DisplayMemberPath 属性值,则 WPF 将退回到简单的 ToString() 调用来显示您的项目。这就是为什么您会看到这些类型字符串而不是您的项目。

【讨论】:

  • 我会试一试并在完成后报告。提前致谢。
  • 您的方法完美无缺。我想我也明白发生了什么。您在 XAML 元素中定义了一个命名空间,以解决我在 XAML 中的 Viewmodel 中使用的对象结构。并且数据模板本身重载了对象和 GUI 元素之间的绑定?这是巨大的,喜欢这个功能,因为我经常使用自定义类!然后使用对我的对象 ChildPartner 中的属性 PartnerID 的引用重载 GUI 元素的 Text 属性?我希望我做对了。非常感谢!
  • 您的猜测并不完全正确。此功能称为“数据模板”,它是 WPF 的核心概念,它可以非常方便地使用 MVVM 模式。你应该read more about it
  • 已经收藏了,下次问之前先做功课:)
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 2015-12-21
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多