c# – 使用Josh Smith的WPF MVVM演示应用程序实现ListView过滤器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用Josh Smith的WPF MVVM演示应用程序实现ListView过滤器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4251字,纯文字阅读大概需要7分钟。
内容图文
![c# – 使用Josh Smith的WPF MVVM演示应用程序实现ListView过滤器](/upload/InfoBanner/zyjiaocheng/763/8e2b8900385145f19b07c42740cca5cc.jpg)
我一直在尝试扩展Josh Smith的演示MVVM应用程序,以便更好地理解它背后的原理,并且当我尝试使用ListView在View上实现过滤器功能时,我遇到了障碍.
我花了几个小时研究和涉猎,但它只是没有用.
我的第一步是将视图中的文本框绑定到ViewModel中的属性:
<TextBox Height="25" Name="txtFilter" Width="150" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}"/>
这在我的VM中匹配:
public string Filter
{
get { return this.filter; }
set
{
this.filter = value;
OnFilterChanged();
}
}
我的VM使用ObservableCollection作为数据源,但我在阅读教程后尝试将其转换为ICollectionView:
internal ObservableCollection<StaffViewModel> 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();
}
我的ApplyFilter函数是:
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模式的新手,所以我还在学习!
编辑
在视图中我将集合绑定到:
<CollectionViewSource
x:Key="StaffGroup"
Source="{Binding Path=AllStaff}"
/>
和ListView是这样的:
<ListView
Name="staffList"
AlternationCount="2"
DataContext="{StaticResource StaffGroup}"
ItemContainerStyle="{StaticResource StaffItemStyle}"
ItemsSource="{Binding}"
Grid.Row="1">
解决方法:
绑定不正确.你需要做一些改变.首先要确保正确设置DataContext.通常,您将在ListView的父级上执行此操作,而不是直接在ListView控件上设置它.这可能是UserControl / Window /等.
所以假设你有一个视图模型:
public class MainViewModel
{
public MainViewModel()
{
//Create some fake data
InnerStaff = new ObservableCollection<StaffViewModel>();
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<StaffViewModel> 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属性绑定,如下所示:
<ListView Name="staffList"
AlternationCount="2"
ItemsSource="{Binding AllStaff}"
Grid.Row="1" />
同样小的事情,我已经更改过滤器来检查空值和空格.您可能还需要将其更改为不区分大小写.
我在这里没有提到但另一件事是至关重要的是在你的StaffViewModel上实现INotifyPropertyChanged – 我假设你有,如果不是这里有一些代码.您通常也会在大多数视图模型上执行此操作,以通知视图属性的更改.
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));
}
}
内容总结
以上是互联网集市为您收集整理的c# – 使用Josh Smith的WPF MVVM演示应用程序实现ListView过滤器全部内容,希望文章能够帮你解决c# – 使用Josh Smith的WPF MVVM演示应用程序实现ListView过滤器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。