WPF Combobox CompositeCollection 绑定 ComboboxItem 内容和字符串列表
WPF Combobox CompositeCollection bind ComboboxItem Content and list of strings
我正在使用 WPF,我的视图中有一个组合框。我的要求是在组合框中显示一个名称列表(范围从 0 到 n 个元素)和一个可本地化的字符串 "Dummy Name"。因此,我从两个不同的来源获取组合框的 ItemsSource,一个名为 "names" 的字符串列表 + 一个本地化字符串 "Dummy Name"。这一切都很好。所有元素都按应有的方式显示。这是我在 WPF 中的定义:
<CollectionViewSource Key="NamesSource" Source="{Binding Context.Data.Names}" />
<ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectedItem="{Binding Person.LastName}">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem Content="{Static res:Labels.DummyName_Combobox_Selection}"/>
<CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
CollectionViewSource 是资源字典的一部分,我只是将其遗漏了。问题出在 ComboBoxItem 元素上。
在组合框中选择时,它会将字符串 "Combobox: Dummy Name" 分配给 Person.LastName,而不是 "Dummy Name"。
将组合框的 SelectedMemberPath 属性设置为 "Content" 也不起作用(我猜是因为 Names 中的字符串没有内容 属性)。
当在组合框中选择 "Dummy Name" 而不是 "Combobox: Dummy Name" 时,如何将 "Dummy Name" 分配给 Person.LastName?
问题是因为您要将 ComboBoxItem
添加到 collection,所以您的 collection 现在有一堆字符串和一个 ComboBoxItem
。 Person.LastName
绑定需要一个字符串,因此 WPF 在 ComboBoxItem
上调用 ToString()
,这恰好输出 "ComboBoxItem: " + 它的内容。
您需要添加另一个 string
而不是 ComboBoxItem
。这有点棘手,因为通常您使用资源来绑定到属性,而不是文字 xaml 元素。但是,您可以使用 ObjectDataProvider
.
<CompositeCollection>
<ObjectDataProvider ObjectInstance="{Static res:Labels.DummyName_Combobox_Selection}" />
<CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
我现在将 StaticExtension 添加到 CompositeCollection 而不是 ComboboxItem。所以现在看起来像这样。
<CollectionViewSource Key="NamesSource" Source="{x:Binding Context.Data.Names}" />
<ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectedItem="{x:Binding Person.LastName}">
<ComboBox.ItemsSource>
<CompositeCollection>
<x:Static Member="res:Labels.DummyName_Combobox_Selection"/>
<CollectionContainer Collection="{x:Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
这似乎达到了预期的效果。
我正在使用 WPF,我的视图中有一个组合框。我的要求是在组合框中显示一个名称列表(范围从 0 到 n 个元素)和一个可本地化的字符串 "Dummy Name"。因此,我从两个不同的来源获取组合框的 ItemsSource,一个名为 "names" 的字符串列表 + 一个本地化字符串 "Dummy Name"。这一切都很好。所有元素都按应有的方式显示。这是我在 WPF 中的定义:
<CollectionViewSource Key="NamesSource" Source="{Binding Context.Data.Names}" />
<ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectedItem="{Binding Person.LastName}">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem Content="{Static res:Labels.DummyName_Combobox_Selection}"/>
<CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
CollectionViewSource 是资源字典的一部分,我只是将其遗漏了。问题出在 ComboBoxItem 元素上。
在组合框中选择时,它会将字符串 "Combobox: Dummy Name" 分配给 Person.LastName,而不是 "Dummy Name"。
将组合框的 SelectedMemberPath 属性设置为 "Content" 也不起作用(我猜是因为 Names 中的字符串没有内容 属性)。
当在组合框中选择 "Dummy Name" 而不是 "Combobox: Dummy Name" 时,如何将 "Dummy Name" 分配给 Person.LastName?
问题是因为您要将 ComboBoxItem
添加到 collection,所以您的 collection 现在有一堆字符串和一个 ComboBoxItem
。 Person.LastName
绑定需要一个字符串,因此 WPF 在 ComboBoxItem
上调用 ToString()
,这恰好输出 "ComboBoxItem: " + 它的内容。
您需要添加另一个 string
而不是 ComboBoxItem
。这有点棘手,因为通常您使用资源来绑定到属性,而不是文字 xaml 元素。但是,您可以使用 ObjectDataProvider
.
<CompositeCollection>
<ObjectDataProvider ObjectInstance="{Static res:Labels.DummyName_Combobox_Selection}" />
<CollectionContainer Collection="{Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
我现在将 StaticExtension 添加到 CompositeCollection 而不是 ComboboxItem。所以现在看起来像这样。
<CollectionViewSource Key="NamesSource" Source="{x:Binding Context.Data.Names}" />
<ComboBox HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectedItem="{x:Binding Person.LastName}">
<ComboBox.ItemsSource>
<CompositeCollection>
<x:Static Member="res:Labels.DummyName_Combobox_Selection"/>
<CollectionContainer Collection="{x:Binding Source={StaticResource NamesSource}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
这似乎达到了预期的效果。