如何合并集合中的两个来源并在组合框中正确显示它们?
How to merge two sources in a Collection and show them correct in a combobox?
我有一些 XAML 代码让我抓狂。首先是为未引用的值添加一个虚拟项目。
为此,我必须实施 CollectionViewSource
和 CompositeCollection
。
现在我不能 select 第一个组合框项目,它出现了但我不能 select 它,因为我在 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<myClass>
顶部的虚拟/占位符组合框项目。我的思维方式错了吗?有更聪明的解决方案吗?我的解决方案中是否遗漏了什么?
使用您的第二种方法并明确地为项目定义 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 代码让我抓狂。首先是为未引用的值添加一个虚拟项目。
为此,我必须实施 CollectionViewSource
和 CompositeCollection
。
现在我不能 select 第一个组合框项目,它出现了但我不能 select 它,因为我在 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<myClass>
顶部的虚拟/占位符组合框项目。我的思维方式错了吗?有更聪明的解决方案吗?我的解决方案中是否遗漏了什么?
使用您的第二种方法并明确地为项目定义 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()
调用来显示您的项目。这就是您看到这些类型字符串而不是您的项目的原因。