[英]How can I display distinct value from a Observablecollection?
我有一本[表格] Book
其中有[栏] Title | Author | Editor | Genre
Title | Author | Editor | Genre
我使用带有标题“标题”,“作者”,“编辑器”,“类型”的数据透视模板。 示例:我有3本这样的书:
1 /标题=“ ABC” | 作者=“约翰” | 编辑=“杰里” | 流派=“小说”
2 /标题=“ EFH” | 作者=“约翰” | 编辑=“哈里” | 类型=“神秘”
3 /标题=“ HJK” | 作者=“汤姆” | 编辑=“杰里” | 类型=“神秘”
我想要的是在每个标题中只是这样显示 :
在标题标题中: ABC | EFH | HJK
ABC | EFH | HJK
在Author标头中仅显示: John | Tom
John | Tom
在编辑器中头球攻门稍稍显示: Jerry | Harry
Jerry | Harry
在流派标题中仅显示: Novel | Mystery
Novel | Mystery
码:
<!--Book-->
<controls:PivotItem Header="Book">
<Grid x:Name="ContentPanel1" Margin="12,0,12,0">
<ListBox x:Name="TitleList" SelectionChanged="TitleList_SelectionChanged" ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Width="466" Margin="0, 0, 0, 12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="360"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0"></Grid>
<StackPanel Grid.Column="1">
<TextBlock FontSize="40" Text="{Binding BookTitle}" FontWeight="Normal" FontStyle="Normal" Style="{StaticResource PhoneTextTitle3Style}" TextWrapping="Wrap"/>
</StackPanel>
<Grid Grid.Column="2">
<Button x:Name="Deletebutton" Height="60" Width="60" Click="deleteButton_Click" BorderBrush="{StaticResource TransparentBrush}">
<Image Source="/Assets/delete.dark.png" Visibility="{StaticResource PhoneDarkThemeVisibility}" Margin="-25" HorizontalAlignment="Left"/>
</Button>
</Grid>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</controls:PivotItem>
<!--Author-->
<controls:PivotItem Header="Author">
<Grid x:Name="ContentPanel2" Margin="12,0,12,0">
<ListBox x:Name="AuthorList" ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock FontSize="40" Text="{Binding Author}" FontWeight="Normal" FontStyle="Normal" Style="{StaticResource PhoneTextTitle3Style}" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</controls:PivotItem>
<!--Editor-->
<controls:PivotItem Header="Editor">
<Grid x:Name="ContentPanel3" Margin="12,0,12,0">
<ListBox x:Name="EditorList" ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock FontSize="40" Text="{Binding Editor}" FontWeight="Normal" FontStyle="Normal" Style="{StaticResource PhoneTextTitle3Style}" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</controls:PivotItem>
<!--Editor-->
<controls:PivotItem Header="Editor">
<Grid x:Name="ContentPanel4" Margin="12,0,12,0">
<ListBox x:Name="BookImporterList" ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock FontSize="40" Text="{Binding Editor}" FontWeight="Normal" FontStyle="Normal" Style="{StaticResource PhoneTextTitle3Style}" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</controls:PivotItem>
<!--Genre-->
<controls:PivotItem Header="Genre">
<Grid x:Name="ContentPanel5" Margin="12,0,12,0">
<ListBox x:Name="GenreList" ItemsSource="{Binding Data}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock FontSize="40" Text="{Binding Genre}" FontWeight="Normal" FontStyle="Normal" Style="{StaticResource PhoneTextTitle3Style}" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</controls:PivotItem>
</controls:Pivot>
在我的MainViewModel中:
private ObservableCollection<Book> _load = new ObservableCollection<Book>();
public ObservableCollection<Book> Load
{
get { return _load; }
set
{
_load = value;
NotifyPropertyChanged("Load");
}
}
public void LoadData()
{
var orderedGenre = (from Book b in BookDB.Books select b);
}
这是获得所需内容的一些可能方式之一。
在ViewModel中提供一个属性来存储所有Books,在这种情况下为Load
属性。 然后为要显示的每个Book属性声明新属性。 它们每个都从对应的Book属性返回不同值的集合。 在Load
属性的设置器中,我为所有从Load
属性返回值的属性引发PropertyChanged事件。
我在这里提供了两种方法,可以使用Distinct方法或GroupBy方法从Book的ObservableCollection获取不同的值。 但是我更喜欢第一种方法,因为在这种情况下它更短/更简单。
private ObservableCollection<Book> _load = new ObservableCollection<Book>();
public ObservableCollection<Book> Load
{
get { return _load; }
set
{
_load = value;
NotifyPropertyChanged("Load");
NotifyPropertyChanged("Titles");
NotifyPropertyChanged("Authors");
}
}
public ObservableCollection<String> Titles
{
get { return new ObservableCollection<string>(Load.Select(o => o.Title).Distinct()); }
//get { return new ObservableCollection<string>(Load.GroupBy(o => o.Title).Select(o => o.Key)); }
}
public ObservableCollection<String> Authors
{
get { return new ObservableCollection<string>(Load.Select(o => o.Author).Distinct()); }
//get { return new ObservableCollection<string>(Load.GroupBy(o => o.Title).Select(o => o.Key)); }
}
public void LoadData()
{
var orderedGenre = (from Book b in BookDB.Books select b);
Load = new ObservableCollection<Book>(orderedGenre);
}
然后在XAML中,将每个ListBox的ItemsSource绑定到在ViewModel中创建的相应属性:
<controls:PivotItem Header="Book">
<Grid x:Name="ContentPanel1" Margin="12,0,12,0">
<ListBox x:Name="TitleList" SelectionChanged="TitleList_SelectionChanged" ItemsSource="{Binding Titles}">
....
....
<controls:PivotItem Header="Author">
<Grid x:Name="ContentPanel2" Margin="12,0,12,0">
<ListBox x:Name="AuthorList" ItemsSource="{Binding Authors}">
....
....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.