簡體   English   中英

如何顯示Observablecollection的獨特價值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM