【问题标题】:WPF Combo box collection container displayed textWPF 组合框集合容器显示的文本
【发布时间】:2018-05-16 09:38:00
【问题描述】:

我使用 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>

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    通常,这是可行的:

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

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

    但是你里面混杂了不同的东西,所以这次不行。这是另一种选择:为您的Group 类创建一个隐式DataTemplate,它只在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>
    

    【讨论】:

    • 我相信是DisplayMemberPath 而不是DisplayMemberName
    • 这解决了问题,但在我选择静态值(第一项)时引入了另一个问题,根本没有显示任何内容。因为它是字符串并且没有我指定的属性
    • 您要显示的属性名称是什么?
    • 属性是Name
    • 我已经稍微改变了你的答案,我只是将ComboBox.ItemTemplate 设置为你的模板并且它起作用了
    【解决方案2】:

    在 Ed Plunkett 的回答中设置的方式对我造成了绑定错误,所以这就是我解决它的方法。我也使用了DataTemplate,但我设置它是为了让DataTemplate 被隐式设置而不是显式设置。也许这与我在ComboBox 中添加了Separator 的事实有关。

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

    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。否则,它将被简单地忽略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2010-12-07
      • 1970-01-01
      • 2011-03-02
      • 2021-12-25
      相关资源
      最近更新 更多