使用Filter时,如何获取CollectionView的真实计数? [英] How to get real count of a CollectionView, when Filter is in use?
本文介绍了使用Filter时,如何获取CollectionView的真实计数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我的View上有< Label Content = {Binding ItemCount} />
绑定到ViewModel的属性时。
When I have a <Label Content="{Binding ItemCount}"/>
on my View to bind to a property on the ViewModel.
在视图模型上,我将属性定义为
On the viewmodel I have the property defined as
public int ItemCount
{
get { RowViewModelsCollectionView.Count; }
}
我显然要求在 CollectionView上计数
,我希望在那里获得仅可见项的计数。不幸的是,我得到了整个行的计数,甚至包括由于过滤器而未在视图中显示的行。
I am clearly asking for count on the CollectionView
, where I am expecting to get the count of only visible items. Unfortunately I get the count of the entire rows, even the ones not showing on the view due the filter.
更新:
在Ctor中:
RowViewModelsCollectionView= new ListCollectionView(rowViewModels) {Filter = Contains};
private bool Contains(object obj)
{
RowViewModel rowViewModel = obj as RowViewModel;
if (rowViewModel != null && Books.ContainsKey(rowViewModel.Book))
{
RaisePropertyChanged("ItemCount"); // Trying out to raise it without joy
return true;
}
return false;
}
我该如何解决?
推荐答案
为什么不使用它?
<Label Content="{Binding ModelView.RowViewModelsCollectionView.Count}"/>
这是一个小例子。
<Window x:Class="WPFValidation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window"
Height="300"
Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<TextBox Grid.Row="0"
Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="1"
Text="{Binding ModelListView.Count}" />
<ListBox Grid.Row="2"
ItemsSource="{Binding ModelListView}" />
</Grid>
</Window>
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
namespace WPFValidation
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow() {
this.DataContext = new ModelView();
this.InitializeComponent();
}
}
public class ModelView : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ICollectionView modelListView;
private ICollection<string> collection;
public ModelView() {
this.collection = new ObservableCollection<string>(new[] {"test1", "test2", "filtering"});
}
public ICollectionView ModelListView {
get { return this.modelListView ?? this.GetModelListView(); }
}
private ICollectionView GetModelListView() {
var collectionView = CollectionViewSource.GetDefaultView(this.collection);
collectionView.Filter += o => o == null || string.IsNullOrEmpty(this.FilterText) || o.Equals(this.FilterText);
return collectionView;
}
private string filterText;
public string FilterText {
get { return this.filterText; }
set {
if (value != this.filterText) {
this.filterText = value;
this.ModelListView.Refresh();
this.RaisePropertyChange("FilterText");
}
}
}
private void RaisePropertyChange(string propertyName) {
var eh = this.PropertyChanged;
if (eh != null) {
eh(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
这篇关于使用Filter时,如何获取CollectionView的真实计数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文