0

我是 WPF 的新手。我有一个 StackPanel,其中包含多个组合框,其中 ItemSource(以 StackPanel 的样式设置)来自CaSupplierColumnsSQL Server 中的视图()(Visual Studio 自动创建了我ordersDataSet从数据源面板拖动的链接)。这没问题。

当我使用CompositeCollection以将自定义值添加到组合框之一 ( Manufacturer) 时出现问题,所有值都正确显示并且添加的项目也出现 - 但为空白。添加的项目在组合框中显示为空白选项。

我发现的罪魁祸首是DisplayMemberPath设置为Columns(这是数据库视图中列标题的名称),当我DisplayMemberPath将此组合框设置为 null 时,添加的项目确实正确显示,但组合框中的其他值显示为System.Data.DataRowView.

如何DisplayMemberPath在一个 CompositeCollection 中有两个不同的 s?或者也许有不同的方法来做到这一点?

这是我当前的 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>
4

1 回答 1

2

我将为集合中的各种类型创建隐式 DataTemplates,并将它们放在StackPanel.Resources您拥有隐式ComboBox样式的相同位置。您必须摆脱该DisplayMemberPath属性,因为这将阻止应用隐式 DataTemplates。

DisplayMemberPath不是一个非常强大的功能;当事情变得奇怪时,您切换到 DataTemplates。使用 WPF 可以做的很酷的事情之一是在 a 中加入一堆异类的东西ComboBox,但是您仍然需要做一些工作才能充分利用它。

SelectedValuePath出于显而易见的原因,这里的用途也将受到限制。您可能必须开始绑定SelectedItem到类型的 viewmodel 属性Object并在那里的设置器中做一些摆弄。

    <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>
于 2016-07-13T18:08:56.010 回答