WPF组合框集合容器显示文本

时间:2016-10-27 20:08:06

标签: c# wpf data-binding

我使用CompositeCollection& CollectionContainer为组合框提供默认值,但问题是实际数据显示为类完整路径。

有没有办法在类中选择一个字段来表示它?因此,它将显示字符串属性而不是StMaryChurchAttendance.Models.Groups

这是xaml:

<StackPanel Orientation="Horizontal" DataContext="{Binding SelectionBarDataContext}" Name="SearchPanel">
    <Label>Group : </Label>
    <ComboBox  Name="SelectionBarGroupsComboBox">
        <ComboBox.Resources>
            <CompositeCollection x:Key="CompositeCollection">
                <CollectionContainer Collection="{Binding Source={x:Reference SearchPanel}, Path=DataContext.Groups }" />
            </CompositeCollection>
        </ComboBox.Resources>
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <ComboBoxItem Name="AllGroupItem" IsSelected="True">All Groups</ComboBoxItem>
                <CollectionContainer  Collection="{Binding Source={StaticResource CompositeCollection}}" />
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>
</StackPanel>

Example of problem

2 个答案:

答案 0 :(得分:1)

通常,这有效:

<ComboBox  
    DisplayMemberPath="WhateverPropertyYouWant"
    Name="SelectionBarGroupsComboBox">

WhateverPropertyYouWant替换为您要显示的属性 - StMaryChurchAttendance.Models.Group的某些属性。不要使用绑定。只需在引号之间键入属性的名称即可。

但是你在那里混合了不同的东西,所以这次不会起作用。这是另一个选项:为DataTemplate类创建隐式Group,这只在ComboBox中可见。 ComboBox将使用它来显示Groups,而不会影响其他任何内容。

<ComboBox  
    Name="SelectionBarGroupsComboBox">
<ComboBox.ItemTemplate>
                        <DataTemplate 
        xmlns:models="clr-namespace:StMaryChurchAttendance.Models"
        DataType="models:Group">
                            <TextBlock Text="{Binding Name}" />
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
    <ComboBox.Resources>
        <CompositeCollection x:Key="CompositeCollection">
            <CollectionContainer Collection="{Binding Source={x:Reference SearchPanel}, Path=DataContext.Groups}" />
        </CompositeCollection>


    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Name="AllGroupItem" IsSelected="True">All Groups</ComboBoxItem>
            <CollectionContainer  Collection="{Binding Source={StaticResource CompositeCollection}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

答案 1 :(得分:0)

在Ed Plunkett的答案中设置的方式给我带来了绑定错误,所以这就是我解决它的方法。我还使用了DataTemplate,但我设置它以便隐式设置DataTemplate而不是显式设置。也许这与我在Separator中放置ComboBox的事实有关。

首先,确保设置类型所在的命名空间

xmlns:models="clr-namespace:StMaryChurchAttendance.Models"

然后,为此类型设置DataTemplate

<ComboBox Name="SelectionBarGroupsComboBox">
    <ComboBox.Resources>
        <CompositeCollection x:Key="CompositeCollection">
            <CollectionContainer Collection="{Binding Source={x:Reference SearchPanel}, Path=DataContext.Groups}" />
        </CompositeCollection>
        <DataTemplate DataType="{x:Type models:Group}">
            TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Name="AllGroupItem" IsSelected="True">All Groups</ComboBoxItem>
            <CollectionContainer  Collection="{Binding Source={StaticResource CompositeCollection}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

只要绑定了Group类型的对象,就会使用DataTemplate。否则,它将被忽略。