2016-08-27 3 views
0

Мне нужно рассчитать лиги, доступные внутри ObservableCollection. Проблема в том, что имя лиги дублируется, поэтому мне нужно удалить дубликаты. На самом деле то, что я это:Сгруппируйте группы в CollectionViewSource

private static ObservableCollection<Models.Event> _matches = new ObservableCollection<Models.Event>(); 

public ObservableCollection<Models.Event> Matches 
{ 
    get { return _matches; } 
} 

По существу Я набор событий, теперь каждое событие имеет лигу связанную. Моя идея создать еще одно свойство под названием LeaguesCount:

public int LeaguesCount 
{ 
    //remove duplicate record from _matches here 
} 

и вернуться лиги доступны, но есть еще одна проблема. Поскольку каждая лига отличается, поэтому я мог бы:

Premier League x3 
Serie A x5 
Super League x4 
... 

Мне нужно, чтобы счетчик был отделен. Замечено, что эта лига являются адъюнкт во имя нации, так что я мог бы в _matches два события с этой структурой:

Event (1)

match_name = 'Foo'; 
match_nation = 'England'; 
match_league = 'Premier League'; 

Event (2)

match_name = 'Test'; 
match_nation = 'England'; 
match_league = 'Premier League'; 

Событие (3)

match_name = 'Another event'; 
match_nation = 'England'; 
match_league = 'Championship'; 

так, как вы можете видеть в England наций доступны три события с Premier League лигами имени и Championship названием лиги, мне нужно, чтобы получить от народа England подсчета всех лиг избежать конечно дубликата.

Структура мероприятия в основном это:

public class Event : ViewModel 
{ 
    private string _matchNation, 
        _matchLeague, 
        _matchName; 
} 

Каждое поле имеет свойство, связанное. Свойства, связанные с этим вопросом являются:

public string MatchNation 
    { 
     get { return _matchNation; } 
     set 
     { 
      _matchNation = value; 
      OnPropertyChanged(); 
     } 
    } 
    public string MatchLeague 
    { 
     get { return _matchLeague; } 
     set 
     { 
      _matchLeague = value; 
      OnPropertyChanged(); 
     } 
    } 
    public string MatchName 
    { 
     get { return _matchName; } 
     set 
     { 
      _matchName = value; 
      OnPropertyChanged(); 
     } 
    } 

Результат хотел:

England -> League count (2) [Championship, Premier League] 

Основной проблемой является другое название нации, потому что я связываю источник в XAML как это:

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

и в GroupHeaderTemplate:

<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" /> 

, но ItemCount фактически возвращает все предметы (событие), а не лиги без дублирования, это ошибка.

+0

Я думаю, что вы сделали опечатку или у вас есть логическая проблема. Вы группируете «MatchNation» -> Существует только ** Англия **, поэтому результат (3) правильный. Вы должны сгруппировать вместо этого 'MatchLeague' – lokusking

+0

@lokusking - это не логическая проблема, мне нужно сгруппировать событие для нации, поэтому в моем групповом описании у меня есть эта организация:« Народы-> Лиги-> События ». Теперь мне нужно получить счет лиг (без дубликатов) для всех стран. Я не знаю, что неясно, дайте мне знать, я попытаюсь объяснить лучше, спасибо. – AgainMe

ответ

1

Вы дали мне действительно немного головную боль на этом. К сожалению, ваши модели не в форме, чтобы сделать это.Я изменил их немного (я был слишком ленив, чтобы реализовать INotifyPropertyChanged везде):

Модели

public class Country { 

     public Country() { 
      this.Leagues = new ObservableCollection<League>(); 
     } 
     public string Name { get; set; } 

     public ObservableCollection<League> Leagues { get; } 

    } 

    public class League { 

     public League() { 
      this.Events = new ObservableCollection<Event>(); 
     } 
     public string Name { get; set; } 

     public ObservableCollection<Event> Events { get; } 
    } 

    public class Event : INotifyPropertyChanged { 
     private string _matchName; 
     public string MatchName { 
      get { return _matchName; } 
      set { 
       _matchName = value; 
       OnPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     [NotifyPropertyChangedInvocator] 
     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

     } 
    } 

ViewModel с демо-данными

public partial class VM { 

     public VM() { 
      var eng = new Country() {Name = "England"}; 
      var l1 = new League() {Name = "Championship" }; 
      l1.Events.Add(new Event() {MatchName = "Another event" }); 
      var l2 = new League() { Name = "Premier League" }; 
      l2.Events.Add(new Event() { MatchName = "Foo" }); 
      l2.Events.Add(new Event() { MatchName = "Bar" }); 
      eng.Leagues.Add(l1); 
      eng.Leagues.Add(l2); 
      this.Countries.Add(eng); 

     } 

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

     public ObservableCollection<Country> Countries { 
      get { return _countries; } 
     } 

    } 

CollectionViewSource

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

ListView

<ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}"> 
     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <WrapPanel DataContext="{Binding Items}"> 
          <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="22" VerticalAlignment="Bottom" /> 
          <TextBlock Text="->" Margin="10,0,0,0" FontWeight="Bold" FontSize="22" VerticalAlignment="Bottom"/> 
          <TextBlock Text="League count" Margin="10,0,0,0" FontWeight="Bold" FontSize="22" VerticalAlignment="Bottom"/> 
          <TextBlock Text="{Binding Leagues.Count}" FontWeight="Bold" FontSize="22" VerticalAlignment="Bottom" Margin="10,0,0,0" /> 
          <ItemsControl ItemsSource="{Binding Leagues}"> 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
             <TextBlock Text="{Binding Name}" FontSize="22" Foreground="Orange" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" /> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
           <ItemsControl.ItemsPanel> 
            <ItemsPanelTemplate> 
             <WrapPanel></WrapPanel> 
            </ItemsPanelTemplate> 
           </ItemsControl.ItemsPanel> 
          </ItemsControl> 
         </WrapPanel> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
     </ListView.GroupStyle> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel DataContext="{Binding Leagues}"> 
        <ItemsControl ItemsSource="{Binding}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Name}"></TextBlock> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 

       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

Результат

Result

Примечание

Как вы можете видеть, отображаемые под вашим GroupHeader Элементы могут быть изменены (Помечено в Желтый). Для этого вы каждый раз меняете «DataContext» панелей (я уверен, другого пути нет).

Закрытие

Не очень, но работает. Возможно, вам придется поиграть с XAML, чтобы он соответствовал вашим потребностям.

+0

Спасибо за ответ. Это исправить проблему, я думаю, я действительно пробовал код. Конечно, мне нужно изменить логику внутри моей структуры. Еще раз спасибо и извините за головную боль :) – AgainMe

+0

только вопрос: можно ли установить в качестве собственностигруппировать описание Лиг? Лиги - это наблюдаемая коллекция в вашей новой логике, как я могу привязать во втором классе свойствгруппы лиги? – AgainMe

+0

@AgainMe Конечно, вы можете. Но тогда результат может быть другим – lokusking

Смежные вопросы