我的應用程序中有一個ObservableCollection<T>
,它可以容納多個項目。具體來說,這是來自可能廣泛的記錄器的摘要信息。我想要做的是嚴格把這個集合的前3個項目綁定到WPF ListView
。綁定到ListView的ObservableCollection中的前N項
是否有XAML語法或足夠簡單的方式在我的虛擬機中創建輔助屬性,始終返回集合中的前3個項目以及更新集合的任何更改(如果您是普通的ObservableCollection<T>
)與完整列表進行交互?
我的應用程序中有一個ObservableCollection<T>
,它可以容納多個項目。具體來說,這是來自可能廣泛的記錄器的摘要信息。我想要做的是嚴格把這個集合的前3個項目綁定到WPF ListView
。綁定到ListView的ObservableCollection中的前N項
是否有XAML語法或足夠簡單的方式在我的虛擬機中創建輔助屬性,始終返回集合中的前3個項目以及更新集合的任何更改(如果您是普通的ObservableCollection<T>
)與完整列表進行交互?
您可以推出自己的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>
你要檢查: INotifyPropertyChanged for Count property in WPF?
您可觀測的CollectionChanged
簡單地聽收集和有通知你關於更改屬性只持有第3項視圖模型(可以簡單地實現爲
public MyTopItems
{
get
{
return myCollection.Take(3);
}
}
這裏是你+1! – Aybe
你也可以使用一個分頁列表
return myCollection.Skip(10).Take(3);
是的,但如果'的ObservableCollection '有一個新項目添加到列表頂部,這是否會自動更新我在列表視圖中使用的集合?這一點就是我想要一個顯示動態日誌細節的區域。一旦有東西被壓入日誌中,它就需要出現在列表的頂部。我不認爲這會起作用。 –
RLH
您需要這樣做,然後還要偵聽'CollectionChanged'事件並調用'OnPropertyChanged(nameof(TopItems))''。那麼你的觀點將保持同步。 – Jonesopolis
@Jonesopolis是的,謝謝我正在製作它! – Aybe