2017-04-06 58 views
1

我的應用程序中有一個ObservableCollection<T>,它可以容納多個項目。具體來說,這是來自可能廣泛的記錄器的摘要信息。我想要做的是嚴格把這個集合的前3個項目綁定到WPF ListView綁定到ListView的ObservableCollection中的前N項

是否有XAML語法或足夠簡單的方式在我的虛擬機中創建輔助屬性,始終返回集合中的前3個項目以及更新集合的任何更改(如果您是普通的ObservableCollection<T>)與完整列表進行交互?

回答

3

您可以推出自己的ObservableCollection<T>,並返回一個屬性返回頂部項目。

下面是一個例子,

代碼:

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.ComponentModel; 
using System.Linq; 
using System.Windows; 

namespace WpfApplication1 
{ 
    public partial class MainWindow 
    { 
     public MyCollection Collection { get; } 

     public MainWindow() 
     { 
      InitializeComponent(); 

      Collection = new MyCollection(); 

      DataContext = Collection; 
     } 

     private void button_Click(object sender, RoutedEventArgs e) 
     { 
      Collection.Add(Collection.Count); 
     } 
    } 

    public sealed class MyCollection : ObservableCollection<int> 
    { 
     public MyCollection() 
     { 
      CollectionChanged += MyCollection_CollectionChanged; 
     } 

     private void MyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { // to notify XAML-side binding 
      OnPropertyChanged(new PropertyChangedEventArgs(nameof(TopItems))); 
     } 

     public IEnumerable<int> TopItems => this.Take(3); 
    } 
} 

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     Title="MainWindow" 
     Width="525" 
     Height="350" 
     d:DataContext="{d:DesignInstance local:MyCollection}" 
     mc:Ignorable="d"> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Button Click="button_Click" Content="Button" /> 
     <ListBox Grid.Row="1" ItemsSource="{Binding}" /> 
     <ListBox Grid.Row="2" ItemsSource="{Binding TopItems}" /> 
    </Grid> 
</Window> 
+1

是的,但如果'的ObservableCollection '有一個新項目添加到列表頂部,這是否會自動更新我在列表視圖中使用的集合?這一點就是我想要一個顯示動態日誌細節的區域。一旦有東西被壓入日誌中,它就需要出現在列表的頂部。我不認爲這會起作用。 – RLH

+0

您需要這樣做,然後還要偵聽'CollectionChanged'事件並調用'OnPropertyChanged(nameof(TopItems))''。那麼你的觀點將保持同步。 – Jonesopolis

+0

@Jonesopolis是的,謝謝我正在製作它! – Aybe

3

你要檢查: INotifyPropertyChanged for Count property in WPF?

您可觀測的CollectionChanged簡單地聽收集和有通知你關於更改屬性只持有第3項視圖模型(可以簡單地實現爲

public MyTopItems 
{ 
    get 
    { 
     return myCollection.Take(3); 
    } 
} 
+0

這裏是你+1! – Aybe

0

你也可以使用一個分頁列表

return myCollection.Skip(10).Take(3); 
相關問題