【发布时间】:2016-07-24 07:43:38
【问题描述】:
我正在构建一个应用程序,向用户显示比赛系列的实时结果。我设置数据结构如下:Countries->Leagues->Matches
特别是在 ViewModel 中,我创建了一个可观察的国家集合,如下所示:
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; }
}
Event 类包含每个事件的属性,特别是事件的名称、日期等。
我按如下方式评估这些数据:
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 -> Inter和Serie B -> Milan
我将联赛两个国家添加到视图模型中的可观察集合中。直到这里没有问题。问题出在 xaml 中。
所以我在 GroupViews 中组织了所有这些东西,为此我使用 CollectionViewSource,特别是:
<CollectionViewSource Source="{Binding Country}" x:Key="GroupedItems">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Name" />
<PropertyGroupDescription PropertyName="League.Name" />
</CollectionViewSource.GroupDescriptions>
上面的代码位于我的 Window.Resources 中,并告诉 CollectionViewSource 组织国家名称和联赛名称相关联的相应联赛。 我有两个这样的 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中显示联赛名称的BUG 并在 GridView 中:
<GridViewColumn Header="Casa" Width="150" DisplayMemberBinding="{Binding Path = League[0].Event[0].MatchHome}"/>
但这当然只会显示特定项目..而不是项目列表。我需要帮助来解决这种情况,我无法弄清楚。谢谢。
【问题讨论】:
-
我能理解您的数据源国家>联赛>赛事。现在您要显示什么?你能用一些符号来解释吗?还是有粗略想法的图像?
-
@AnjumSKhan 请在此处查看练习示例:stackoverflow.com/questions/38551511/… 是相关问题,在此问题中还有其他与其他主题相关的详细信息,谢谢