使用Josh Smith的WPF MVVM演示应用程序实现ListViewfilter
我一直在尝试扩展Josh Smith的演示MVVM应用程序,以便更好地理解它背后的原理,并且当我尝试使用ListView在View上实现filterfunction时,我遇到了障碍。
我花了几个小时研究和涉猎,但它只是不起作用。
我的第一步是将视图中的文本框绑定到ViewModel中的属性:
这在我的VM中匹配:
public string Filter { get { return this.filter; } set { this.filter = value; OnFilterChanged(); } }
我的VM使用ObservableCollection作为数据源,但我在阅读教程后尝试将其转换为ICollectionView:
internal ObservableCollection InnerStaff { get; set; } internal CollectionViewSource CvsStaff { get; set; } public ICollectionView AllStaff { get { return CvsStaff.View; } }
在我的构造函数中,我指定:
CvsStaff = new CollectionViewSource(); CvsStaff.Source = this.InnerStaff; CvsStaff.Filter += ApplyFilter;
当我的Filter属性更新时,它调用OnFilterChanged,它是:
private void OnFilterChanged() { CvsStaff.View.Refresh(); }
我的ApplyFilterfunction是:
void ApplyFilter(object sender, FilterEventArgs e) { StaffViewModel svm = (StaffViewModel)e.Item; if (this.Filter.Length == 0) { e.Accepted = true; } else { e.Accepted = svm.LastName.Contains(Filter); } }
我做过一个愚蠢的错误,任何人都可以帮我发现吗? 我是WPF和MVVM模式的新手,所以我还在学习!
编辑
在视图中我将集合绑定到:
和ListView是这样的:
绑定不正确。 你需要做一些改变。 首先要确保正确设置DataContext。 通常,您将在ListView的父级上执行此操作,而不是直接在ListView控件上设置它。 这可能是UserControl / Window /等。
假设你有一个视图模型:
public class MainViewModel { public MainViewModel() { //Create some fake data InnerStaff = new ObservableCollection(); InnerStaff.Add(new StaffViewModel {FirstName = "Sue", LastName = "Bucknell"}); InnerStaff.Add(new StaffViewModel {FirstName = "James", LastName = "Bucknell"}); InnerStaff.Add(new StaffViewModel {FirstName = "John", LastName = "Harrod"}); CvsStaff = new CollectionViewSource(); CvsStaff.Source = this.InnerStaff; CvsStaff.Filter += ApplyFilter; } private string filter; public string Filter { get { return this.filter; } set { this.filter = value; OnFilterChanged(); } } private void OnFilterChanged() { CvsStaff.View.Refresh(); } internal ObservableCollection InnerStaff { get; set; } internal CollectionViewSource CvsStaff { get; set; } public ICollectionView AllStaff { get { return CvsStaff.View; } } void ApplyFilter(object sender, FilterEventArgs e) { StaffViewModel svm = (StaffViewModel)e.Item; if (string.IsNullOrWhiteSpace(this.Filter) || this.Filter.Length == 0) { e.Accepted = true; } else { e.Accepted = svm.LastName.Contains(Filter); } } }
假设你有一个Window MainWindow.cs(后面的代码),你可以(对于这个例子)在这里连接DataContext。
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainViewModel(); } }
然后你有几个选择来进行绑定,你可以在XAML或代码中指定你的CollectionViewSource,但你已经做到了。 即xaml,密钥为x:key =“StaffGroup”,VM为CvsStaff。 假设我们完全摆脱了xaml并使用VM one,这是正确设置的。 然后你将使用ItemsSource属性绑定,如下所示:
同样小的事情,我已经更改filter来检查空值和空格。 您可能还需要将其更改为不区分大小写。
我在这里没有提到但另一件事是至关重要的是在你的StaffViewModel上实现INotifyPropertyChanged – 我假设你有,如果不是这里有一些代码。 您通常也会在大多数视图模型上执行此操作,以通知视图属性的更改。
上述就是C#学习教程:使用Josh Smith的WPF MVVM演示应用程序实现ListViewfilter分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
internal class StaffViewModel : INotifyPropertyChanged { private string _firstName; public string FirstName { get { return _firstName; } set { _firstName = value; OnPropertyChanged("FirstName"); } } private string _lastName; public string LastName { get { return _lastName; } set { _lastName = value; OnPropertyChanged("LastName"); } } public override string ToString() { return string.Format("{0} {1}", FirstName, LastName); } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1011345.html