如何绑定CollectionViewSource中的项目列表?

时间:2016-07-24 11:25:14

标签: c# wpf

我已经陷入这个问题好几天了。从未找到解决方案。因此,我列出了名为Country的项目列表,在此列表中我还有另一个名为League的项目列表。我创建了一个CollectionViewSource,用于在国家名称和联盟名称中组织所有这些,但我无法绑定所有联赛名称:

<CollectionViewSource Source="{Binding Country}" x:Key="GroupedItems">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Name" />
                <PropertyGroupDescription PropertyName="League.Name" />
            </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

我应该写:<PropertyGroupDescription PropertyName="League[0].Name" />

但这只会绑定联赛名单的第一项。任何解决方案?

实践示例

假设有两个国家(意大利,英格兰),意大利国家有两个联赛(意甲和乙级联赛)和英格兰只有(首映联赛)。 Serie A和Serie B共有3场比赛,2场意甲和1场意甲联赛。在首映联赛中有4场比赛。 在ListView组织中作为you can see here的另一个主题,在UI中应该显示以下结构:

ITALY
    SERIE A
          INTER
          MILAN
    SERIE B
          JUVENTUS
ENGLAND
    PREMIERE LEAGUE
          LEICESTER
          MANCHESTER UNITED
          MANCHESTER CITY
          LIVERPOOL

现在意大利队和英格兰队分别成为意甲联赛,意甲联赛和首发联赛,有一个扩展器(你可以在我的另一个问题中看到),每个联赛都有比赛。 问题是,在CollectionViewSource中,我无法显示联赛的名称,因为联赛在列表中,同样的问题是比赛,这是联赛中可用的列表,数据结构: / p>

Nations->Leagues->Matches

1 个答案:

答案 0 :(得分:1)

我按你想要的输出去了。请检查并告知这是否是您想要的。

public partial class WinExpander : Window
{
    public WinExpander()
    {
        InitializeComponent();

        this.DataContext = new ViewModel();
    }
} 

public class ViewModel
    {
        public List<Country> Countries { get; set; }
        public ViewModel()
        {
            Countries = new List<Country>();
        }
    }

public class Country
    {
        public string Name { get; set; }
        public List<League> Leagues { get; set; }

        public Country()
        {
            Leagues = new List<League>();
        }
    }

    public class League
    {
        public string Name { get; set; }
        public List<Match> Matches { get; set; }

        public League()
        {
            Matches = new List<Match>();
        }
    }

    public class Match
    {
        public string Name { get; set; }
    }

XAML

<Window.Resources>
    <CollectionViewSource x:Key="GroupedItems" Source="{Binding Countries}"/>
</Window.Resources>
...
<ItemsControl ItemsSource="{Binding Source={StaticResource GroupedItems}}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Expander Header="{Binding Name}">
                        <ItemsControl ItemsSource="{Binding Leagues}" Margin="25 0 0 0">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Expander Header="{Binding Name}">
                                        <ItemsControl ItemsSource="{Binding Matches}" Margin="25 0 0 0">
                                            <ItemsControl.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Name}"/>
                                                </DataTemplate>
                                            </ItemsControl.ItemTemplate>
                                        </ItemsControl>
                                    </Expander>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </Expander>         
                </DataTemplate>
            </ItemsControl.ItemTemplate>
 </ItemsControl>

您也可以将任何ItemsControl替换为ListBox

根据用户要求使用GroupStyleListView的另一种解决方案。

<CollectionViewSource x:Key="GroupedItems" Source="{Binding Countries}">
     <CollectionViewSource.GroupDescriptions>
         <PropertyGroupDescription PropertyName="Name"/>
     </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
...
<ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}" Name="Playing">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Country" Width="150" DisplayMemberBinding="{Binding Source={x:Static sys:String.Empty}}" />
            <GridViewColumn Header="Leagues">                        
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding Leagues}" Margin="25 0 0 0">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Grid HorizontalAlignment="Stretch" Background="#FFBCDAEC">
                                        <TextBlock FontSize="18" Padding="5" Text="{Binding Name}"/>
                                    </Grid>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Expander IsExpanded="True">
                                    <Expander.Header>
                                        <TextBlock Text="{Binding Name}" Foreground="Red" FontSize="22" VerticalAlignment="Bottom" />
                                    </Expander.Header>
                                    <ItemsPresenter />
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

enter image description here