Шаблон данных для двух перечислимых, сгруппированных вместе - PullRequest
3 голосов
/ 01 ноября 2010

Допустим, у меня есть следующие два класса:

public class TestResults
{
    public string TestGroup {get; set; }
    public string TestName {get; set; }
    public bool TestPassed {get; set; }
}

public class TestSummary
{
    public string TestGroup {get; set; }
    public string SummaryText {get; set; }
}

Некоторые тестовые данные, которые у меня есть, могут выглядеть так:

TestResults
TestGroup       TestName        TestPassed
==========================================
Item1           HasPrice        True
Item1           HasDiscount     True
Item2           HasPrice        True
Item2           HasDiscount     False

TestSummary
TestGroup    SummaryText
=================================================
Item1        SKU: 234 Price: 13.40 Discount: 1.34
Item2        SKU: 345 Pirce: 15.70

Если у меня есть IEnumerable<TestResults> вместе с IEnumerable<TestSummary>, я бы хотел сгруппировать их по TestGroup и отобразить их информацию примерно так:

______________________________________________________________________
| Item1    _________________________  _______________________________ |
|          | Grid of TestResults   | | SummaryText for Item1        | |
|          |_______________________| |______________________________| |
|_____________________________________________________________________|
______________________________________________________________________
| Item2    _________________________  _______________________________ |
|          | Grid of TestResults   | | SummaryText for Item2        | |
|          |_______________________| |______________________________| |
|_____________________________________________________________________|

У меня есть 2 вопроса о том, как это можно сделать:

  1. Как мне объединить два IEnumerable и сгруппировать их так, чтобы они могли быть использованы табличкой данных?
  2. Как может выглядеть мой шаблон данных, чтобы иметь возможность отображать сгруппированные данные?

1 Ответ

4 голосов
/ 01 ноября 2010

Я думаю, что вам нужно создать новый класс ItemViewModel, который будет содержать соответствующие TestResults и SummaryText в качестве свойств, с которыми вы можете связываться. Чем вы сможете создать IEnumerable ItemViewModels и привязать свой ListView (или все, что вы хотите к нему). Я также предлагаю, чтобы Grid of TestResults лучше было заменить на ListView, привязанный к свойству TestResults модели представления.

Надеюсь, это поможет! Кратко описано - пожалуйста, оставьте комментарий, если мое объяснение недостаточно ясно.

UPD:

Этот код должен заполнять IEnumerable моделей представления:

public class ItemViewModel
{
    public IEnumerable<string> TestResults { get; set; }
    public string SummaryText { get; set; }
}

...

var viewModels = testResults.Select(tr => 
    new ItemViewModel() { 
      TestResults = testResults.Where(t => t.TestGroup == tr.TestGroup)
                               .Select(t => t.TestName + " " + t.TestPassed),
      SummaryText = testSummaries.First(ts => ts.TestGroup == tr.TestGroup) 
    });

UPD2:

Этот XAML должен помочь:

<!-- In your resources -->
<DataTemplate x:Key="ItemViewModelTemplate">
    <StackPanel Orientation="Horizontal">
        <ListView ItemsSource={Binding TestResults} />
        <TextBlock Text={Binding SummaryText} />
    </StackPanel>
</DataTemplate>

...

<!-- In your main xaml file -->
<!-- Let's assume that your main VM contains property ViewModels 
     that is filled like described above -->
<ListView ItemsSource={Binding ViewModels} 
          ItemTemplate="{StaticResource ItemViewModelTemplate}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...