Let's say I have the following two classes:
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; }
}
Some of the test data I have might look like this:
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
If I have an IEnumerable<TestResults>
along with an IEnumerable<TestSummary>
, I'd like to be able to group them together on TestGroup
and display their information somewhat like this:
______________________________________________________________________
| Item1 _________________________ _______________________________ |
| | Grid of TestResults | | SummaryText for Item1 | |
| |_______________________| |______________________________| |
|_____________________________________________________________________|
_开发者_运维知识库_____________________________________________________________________
| Item2 _________________________ _______________________________ |
| | Grid of TestResults | | SummaryText for Item2 | |
| |_______________________| |______________________________| |
|_____________________________________________________________________|
I have 2 questions about how this might be done:
- How do I join the two
IEnumerable
s and group them together so that they can be consumed by a datatemplate? - What might my data template look like to be able to display the grouped data?
I think that you need to create a new class ItemViewModel which will contain corresponding TestResults and SummaryText as properties that you can bind to. Than you will be able to create an IEnumerable of ItemViewModels and bind your ListView (or whatever you want to it). I also suggest that Grid of TestResults
is better to replace with ListView bound to TestResults property of a view model.
Hope this helps! Briefly described - please leave a comment if my explanation is not clear enough.
UPD:
This code should fill the IEnumerable of view models:
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:
This XAML should do the trick:
<!-- 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}" />
精彩评论