2016-07-24 59 views
0

我正在构建向用户显示匹配系列的实时结果的应用程序。我设置数据的结构如下:Countries->Leagues->Matches 尤其是在视图模型我创建国家可观察到的集合,如下所示:无法绑定GridView列中的项目列表

private ObservableCollection<Models.Country> _countries = new ObservableCollection<Models.Country>(); 

public ObservableCollection<Models.Country> Country 
{ 
    get { return _countries; } 
} 

和模型:

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

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

类事件包含每个事件的属性,特别是事件的名称,日期等等。

我按如下方式确定这个数据:

Country country = new Country(); 
country.Name = "Italy"; 

League league = new League(); 
league.Name = "Serie A"; 
League league2 = new League(); 
league2.Name = "Serie B"; 

Event @event = new Event(); 
@event.MatchHome = "Inter"; 

Event event2 = new Event(); 
@event.MatchHome = "Milan"; 

league.Event = new List<Event>(); 
league2.Event = new List<Event>(); 

league.Event.Add(@event); 
league2.Event.Add(event2); 

country.League = new List<League>(); 

country.League.Add(league); 
country.League.Add(league2); 

lsVm.Country.Add(country); //lsVm contains the ViewModel 

你如何看到我创建了一个名为country(意大利)的对象,在这种情况下将包含两个联赛(意甲)和(意乙)。每个联赛实际上包含一场比赛实际上在打Serie A -> InterSerie B -> Milan

我添加了联赛两国的国家,最后是国家在视图模型的可观察收藏。直到这里没问题。问题出现在xaml中。

所以我组织的所有的这些东西GroupViews内,这样做我使用CollectionViewSource,特别是:

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

上面的代码位于我的窗口。资源,并告诉CollectionViewSource组织国家名称和联赛名称相关的各个联赛。 我有2个ListView的,因为这:

<ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}" Name="Playing"> 
        <ListView.View> 
         <GridView> 
          <GridViewColumn Header="Date" Width="150" DisplayMemberBinding="{Binding Path = League.Event.MatchDate}"/> 
          <GridViewColumn Header="Minutes" Width="70" DisplayMemberBinding="{Binding Path = League.Event.MatchMinute}"/> 
          <GridViewColumn Header="Home" Width="150" DisplayMemberBinding="{Binding Path = League.Event.MatchHome}"/> 
          <GridViewColumn Header="Score" Width="100" DisplayMemberBinding="{Binding Path = League.Event.MatchScore}"/> 
          <GridViewColumn Header="Away" Width="150" DisplayMemberBinding="{Binding Path = League.Event.MatchAway}"/> 
         </GridView> 
        </ListView.View> 
<GroupStyle> 
          <GroupStyle.ContainerStyle> 
           <Style TargetType="{x:Type GroupItem}"> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate> 
               <Expander IsExpanded="True" Background="#4F4F4F" > 
                <Expander.Header> 
                 <StackPanel Orientation="Horizontal" Height="22"> 
                  <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="White" FontSize="22" VerticalAlignment="Bottom" /> 
                  <TextBlock Text="{Binding ItemCount}" FontSize="22" Foreground="Orange" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" /> 
                  <TextBlock Text=" Leagues" FontSize="22" Foreground="White" FontStyle="Italic" VerticalAlignment="Bottom" /> 
                 </StackPanel> 
                </Expander.Header> 
                <ItemsPresenter /> 
               </Expander> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </GroupStyle.ContainerStyle> 
         </GroupStyle> 

的GroupStyle包含将包含每个匹配的联赛,现在的问题是,我看不到任何联赛的任何匹配“造成这个项目是一个内名单。因此,对于显示他们,我应该在XAML编写代码:

<PropertyGroupDescription PropertyName="League[0].Name" /> 

此修复程序显示为GroupStyle 和GridView中联赛名称的错误:

<GridViewColumn Header="Casa" Width="150" DisplayMemberBinding="{Binding Path = League[0].Event[0].MatchHome}"/> 

但是这当然会显示只有特定的物品..不是物品清单。我需要帮助来解决这种情况,我无法弄清楚。谢谢。

+0

我能理解你的DataSource国家>联赛>活动。现在你试图展示什么?你能用一些符号来解释吗?或者有一个粗略的想法? – AnjumSKhan

+0

@AnjumSKhan请在这里查看练习示例:http://stackoverflow.com/questions/38551511/how-to-bind-a-list-of-item-in-collectionviewsource是相关的问题,在这个问题还有其他与其他主题相关的详细信息,谢谢 – Heisenberg

回答

1

如果你想使用ListView的分组能力,你必须提供一个你想分组的物品(在你的情况下,联赛)的平面列表,而不是标题项。 CollectionView通过指定GroupDescriptions来完成分组。

例如,假设League类有一个Country属性:

class ViewModel 
{ 
    public ObservableCollection<Models.Country> Country { get; } 

    public IEnumerable<League> AllLeagues => Country.SelectMany(c => c.Leagues); 
} 

public class League 
{ 
    public string Name { get; set; } 
    public List<Event> Event { get; set; } 
    // add Country here 
    public Country Country { get; set; } 
} 

class 

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

然后当你绑定的列,则直接绑定到League特性,例如:

<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Path=Event.MatchDate}"/> 

而在组风格中,您可以像以前那样绑定到Country属性。

替代解决方案

如果你想显示在WPF任何分层数据您可以使用为它建造(如Xceed数据网格)的控制或共同破解它内置的WPF数据网格的行细节。

这里是一个示例XAML为此(注意它使用您的原始数据结构没有我上面建议的修改)。这些基本上是3个嵌套在一起的数据网格。每个网格都有自己的一组列,所以你可以为每个级别定义任何你想要的(国家,联盟,事件)。

<Window x:Class="WpfApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     xmlns:app="clr-namespace:WpfApp" 
     d:DataContext="{d:DesignData ViewModel}"> 
    <FrameworkElement.Resources> 
     <app:VisibilityToBooleanConverter x:Key="VisibilityToBooleanConverter" /> 
     <DataTemplate x:Key="HeaderTemplate"> 
      <Expander IsExpanded="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}, Path=DetailsVisibility, Converter={StaticResource VisibilityToBooleanConverter}}" /> 
     </DataTemplate> 
     <Style x:Key="DataGridStyle" 
       TargetType="DataGrid"> 
      <Setter Property="RowHeaderTemplate" 
        Value="{StaticResource HeaderTemplate}" /> 
      <Setter Property="RowDetailsVisibilityMode" 
        Value="Collapsed" /> 
      <Setter Property="AutoGenerateColumns" 
        Value="False" /> 
      <Setter Property="IsReadOnly" 
        Value="True" /> 
     </Style> 
    </FrameworkElement.Resources> 
    <Grid> 
     <DataGrid ItemsSource="{Binding Country}" 
        Style="{StaticResource DataGridStyle}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" 
            Binding="{Binding Name}" /> 
      </DataGrid.Columns> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <DataGrid ItemsSource="{Binding League}" 
           Style="{StaticResource DataGridStyle}"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="Name" 
               Binding="{Binding Name}" /> 
         </DataGrid.Columns> 
         <DataGrid.RowDetailsTemplate> 
          <DataTemplate> 
           <DataGrid ItemsSource="{Binding Event}" 
              AutoGenerateColumns="False" 
              IsReadOnly="True"> 
            <DataGrid.Columns> 
             <DataGridTextColumn Header="Match Home" 
                  Binding="{Binding MatchHome}" /> 
            </DataGrid.Columns> 
           </DataGrid> 
          </DataTemplate> 
         </DataGrid.RowDetailsTemplate> 
        </DataGrid> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 
    </Grid> 
</Window> 

您还需要为我所用的转换器的代码:

public class VisibilityToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     => value as Visibility? == Visibility.Visible; 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     => value as bool? == true ? Visibility.Visible : Visibility.Collapsed; 
} 
+0

或多或少,你已经集中了这一点,但我有一个可观察的国家集合,其中包含包含比赛的联赛。真正的问题在于,我无法在GridViewColumn标题和GroupStyle(扩展器)中显示联盟的名称和每个比赛的细节,原因都在列表中。 – Heisenberg

+0

如果您想使用“CollectionView”的本地分组支持,您将*具有*对数据建模有点不同。您可以创建一个中间层模型,以我描述的方式排列数据。 –

+0

我明白你的意思,但我需要设置哪种结构?因为我需要具有国家 - >联赛 - >比赛的组织结构 – Heisenberg