CompositeCollection 中的多个 DisplayMemberPaths?
Multiple DisplayMemberPaths in a CompositeCollection?
我是 WPF 新手。我有一个 StackPanel,其中包含多个组合框,其中 ItemSource(在 StackPanel 的样式中设置)来自 SQL 服务器中的视图(CaSupplierColumns
)(Visual Studio 自动创建了 link我从数据源面板中拖出了 ordersDataSet
)。没问题。
当我使用 CompositeCollection
将自定义值添加到其中一个组合框 (Manufacturer
) 时出现问题,所有值都正确显示并且添加的项目也出现 - 但空白。添加的项目在组合框中显示为空白选项。
我发现的罪魁祸首是 DisplayMemberPath
设置为 Columns
(这是数据库视图中列 header 的名称),当我设置 DisplayMemberPath
对于此组合框为 null,添加的项目确实正确显示,但组合框中的其他值显示为 System.Data.DataRowView
.
如何在一个 CompositeCollection 中包含两个不同的 DisplayMemberPath
?或者也许有不同的方法来做到这一点?
这是我当前的 XAML(已剥离以保留关键部分):
<Window.Resources>
<local:OrdersDataSet x:Key="ordersDataSet" />
<CollectionViewSource x:Key="caSupplierColumnsViewSource" Source="{Binding CaSupplierColumns, Source={StaticResource ordersDataSet}}" />
</Window.Resources>
<StackPanel Name="MapFields" DataContext="{StaticResource caSupplierColumnsViewSource}">
<StackPanel.Resources>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding}" />
<Setter Property="DisplayMemberPath" Value="Columns" />
<Setter Property="SelectedValuePath" Value="Columns" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
</Style>
</StackPanel.Resources>
...
<ComboBox Name="MfrPartNo" />
...
<ComboBox Name="Manufacturer">
<ComboBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=caSupplierColumnsViewSource}}" />
<ListBoxItem>Another option</ListBoxItem>
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
</StackPanel>
我会为集合中的各种类型创建隐式 DataTemplates,并将它们放在相同的 StackPanel.Resources
中,您可以在其中获得隐式 ComboBox
样式。您必须摆脱 DisplayMemberPath
属性,因为这将阻止应用隐式 DataTemplates。
DisplayMemberPath
不是一个非常强大的功能;当事情变得奇怪时,你切换到 DataTemplates。在 ComboBox
中放入大量不同种类的东西是您可以使用 WPF 做的很酷的事情之一,但是您仍然需要做一些工作才能充分利用它。
出于显而易见的原因,SelectedValuePath
在这里的使用也将受到限制。您可能必须开始将 SelectedItem
绑定到 Object
类型的视图模型 属性 并在 setter 中进行一些调整。
<StackPanel.Resources>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding}" />
<Setter Property="SelectedValuePath" Value="Columns" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
</Style>
<DataTemplate DataType="{x:Type Manufacturer}">
<!-- I'm assuming Manufacturer has a Name property; change as needed -->
<TextBlock Text="{Binding Name}" />
</DataTemplate>
<DataTemplate
xmlns:sysdata="clr-namespace:System.Data;assembly=System.Data"
DataType="{x:Type sysdata:DataRowView}">
<TextBlock Text="{Binding Columns}" />
</DataTemplate>
<!-- Etc. -->
</StackPanel.Resources>
我是 WPF 新手。我有一个 StackPanel,其中包含多个组合框,其中 ItemSource(在 StackPanel 的样式中设置)来自 SQL 服务器中的视图(CaSupplierColumns
)(Visual Studio 自动创建了 link我从数据源面板中拖出了 ordersDataSet
)。没问题。
当我使用 CompositeCollection
将自定义值添加到其中一个组合框 (Manufacturer
) 时出现问题,所有值都正确显示并且添加的项目也出现 - 但空白。添加的项目在组合框中显示为空白选项。
我发现的罪魁祸首是 DisplayMemberPath
设置为 Columns
(这是数据库视图中列 header 的名称),当我设置 DisplayMemberPath
对于此组合框为 null,添加的项目确实正确显示,但组合框中的其他值显示为 System.Data.DataRowView
.
如何在一个 CompositeCollection 中包含两个不同的 DisplayMemberPath
?或者也许有不同的方法来做到这一点?
这是我当前的 XAML(已剥离以保留关键部分):
<Window.Resources>
<local:OrdersDataSet x:Key="ordersDataSet" />
<CollectionViewSource x:Key="caSupplierColumnsViewSource" Source="{Binding CaSupplierColumns, Source={StaticResource ordersDataSet}}" />
</Window.Resources>
<StackPanel Name="MapFields" DataContext="{StaticResource caSupplierColumnsViewSource}">
<StackPanel.Resources>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding}" />
<Setter Property="DisplayMemberPath" Value="Columns" />
<Setter Property="SelectedValuePath" Value="Columns" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
</Style>
</StackPanel.Resources>
...
<ComboBox Name="MfrPartNo" />
...
<ComboBox Name="Manufacturer">
<ComboBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=caSupplierColumnsViewSource}}" />
<ListBoxItem>Another option</ListBoxItem>
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
</StackPanel>
我会为集合中的各种类型创建隐式 DataTemplates,并将它们放在相同的 StackPanel.Resources
中,您可以在其中获得隐式 ComboBox
样式。您必须摆脱 DisplayMemberPath
属性,因为这将阻止应用隐式 DataTemplates。
DisplayMemberPath
不是一个非常强大的功能;当事情变得奇怪时,你切换到 DataTemplates。在 ComboBox
中放入大量不同种类的东西是您可以使用 WPF 做的很酷的事情之一,但是您仍然需要做一些工作才能充分利用它。
SelectedValuePath
在这里的使用也将受到限制。您可能必须开始将 SelectedItem
绑定到 Object
类型的视图模型 属性 并在 setter 中进行一些调整。
<StackPanel.Resources>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding}" />
<Setter Property="SelectedValuePath" Value="Columns" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
</Style>
<DataTemplate DataType="{x:Type Manufacturer}">
<!-- I'm assuming Manufacturer has a Name property; change as needed -->
<TextBlock Text="{Binding Name}" />
</DataTemplate>
<DataTemplate
xmlns:sysdata="clr-namespace:System.Data;assembly=System.Data"
DataType="{x:Type sysdata:DataRowView}">
<TextBlock Text="{Binding Columns}" />
</DataTemplate>
<!-- Etc. -->
</StackPanel.Resources>