wpf CollectionViewSource的运用

本文介绍了一个使用WPF结合CollectionViewSource展示部门及其员工信息的例子。通过定义Department和Employee类,实现数据绑定到UI的过程,并展示了如何用XAML设置界面布局及数据显示。

实体类:

员工类: 

public class Department : ObservableCollection<Employee>

{

public string DepName { get; set; }

public ObservableCollection<Employee> Employees { get; set; }
}

 

 

部门类:

public class Employee
{
public int Number { get; set; } //工号
public string Name { get; set; } //姓名
public string Sex { get; set; } //性别
public int BirthYear { get; set; } //出生年份
}

 

 

部门集合类:

public class DepartmentList : ObservableCollection<Department>
{
public DepartmentList()
{
ObservableCollection<Employee> employee1 = new ObservableCollection<Employee> 
{
new Employee{Number=2012,Name="netboy",Sex="boy",BirthYear=1992},
new Employee{Number=2013,Name="dandan",Sex="girl",BirthYear=2000},
new Employee{Number=2014,Name="xiaobai",Sex="girl",BirthYear=2012}
};

ObservableCollection<Employee> employee2 = new ObservableCollection<Employee> 
{
new Employee{Number=2020,Name="kaizi",Sex="girl",BirthYear=2011},
new Employee{Number=2021,Name="yangzai",Sex="gril",BirthYear=2010}
};

this.Add(new Department { DepName = "技术部", Employees = employee1 });
this.Add(new Department { DepName = "商务部", Employees = employee2 });
//ObservableCollection<Department> deparment = new ObservableCollection<Department> 
//{
// new Department{DepName="tengfei",Employees=employee1},
// new Department{DepName="google",Employees=employee2}
//};
}

 

UI,XAML:

 

<Window x:Class="CollectionViewSourceDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CollectionViewSourceDemo.Models"
Title="MainWindow" Height="500" Width="1000">
<Window.Resources>
<local:DepartmentList x:Key="deplist"/>
<CollectionViewSource x:Key="departmentView" Source="{StaticResource ResourceKey=deplist}"/>
<DataTemplate x:Key="dtEmployees">
  <StackPanel Height="50" HorizontalAlignment="Center" Width="480" VerticalAlignment="Top" Orientation="Horizontal">
    <TextBlock Height="50" HorizontalAlignment="Left" Width="90" Text="{Binding Number}"/>
    <TextBlock Height="50" Width="120" Text="{Binding Name}"/>
    <TextBlock Height="50" Width="120" Text="{Binding BirthYear}"/>
    <TextBlock Height="50" Width="120" Text="{Binding Sex}"/>
 </StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<StackPanel>
<TextBlock Width="200" Height="50" FontSize="36" Text="请选择部门:"/>
  <ListBox Name="lb1" Height="100" Width="156" DisplayMemberPath="DepName" ItemsSource="{Binding Source={StaticResource departmentView}}"
    HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="32" />
  <TextBlock Height="62" Width="111" HorizontalAlignment="Left" VerticalAlignment="Top"
       Text="{Binding Path=DepName,Source={StaticResource departmentView}}" Foreground="Red" FontSize="32" />
  <TextBlock Text="员工列表" FontSize="20" Foreground="Blue"/>
  <StackPanel Orientation="Horizontal">
  <TextBlock Text="工号" Margin="5" />
  <TextBlock Text="名字" Margin="70,5,5,5"/>
  <TextBlock Text="出生日期" Margin="70,5,5,5" />
  <TextBlock Text="性别" Margin="75,5,5,5"/>
  </StackPanel>
 <ListBox Name="lb2" ItemsSource="{Binding Path=Employees,Source={StaticResource departmentView}}"
ItemTemplate="{StaticResource dtEmployees} /> </StackPanel> </Grid> </Window>

 

转载于:https://www.cnblogs.com/527289276qq/p/4315741.html

<think> 首先,用户的问题是:“我想获取WPFCollectionViewSource使用指南 请问WPFCollectionViewSource使用方法”。这是一个关于WPF技术的问题,具体是CollectionViewSource使用方法。 现在,我需要参考提供的引用内容。这些引用是关于WPF中的CollectionView和CollectionViewSource的。让我回顾一下这些引用: - 引用[1]:解释了CollectionView是什么,它是一个列表视图,用于对绑定数据进行排序、分组或过滤。CollectionViewSource是它的前端代理。 - 引用[2]:讨论了如何通过CollectionViewSource给ItemsControl添加动态筛选功能。 - 引用[3]:简短地提到了在XAML中使用CollectionViewSource进行数据绑定和过滤。 - 引用[4]:涉及CollectionViewSource的排序和分组,但内容看起来不完整。 系统级指令要求我必须使用中文回答,并且在行内数学表达式使用$...$格式,独立公式使用$$...$$格式。但在这个上下文中,这是一个编程问题,可能不涉及数学公式,所以我可以忽略数学格式的部分。 指令还要求: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 生成相关问题。 - 在引用的段落末尾自然地添加引用标识。 用户提到“参考站内引用”,所以我需要基于这些引用构建回答。引用来自内部资料,我需要整合这些信息。 关键点: - CollectionViewSource是一个代理,用于在XAML中操作CollectionView。 - CollectionView允许排序、分组、过滤数据,而不改变原始数据。 - 使用ItemsSource属性绑定数据时,会自动生成CollectionView。 - 示例:在XAML中绑定ItemsSource到CollectionViewSource的View属性。 我的回答应该结构化: 1. 介绍CollectionViewSource是什么。 2. 为什么需要使用它。 3. 基本使用方法。 4. 具体示例(如排序、分组、过滤)。 5. 注意事项。 6. 生成相关问题。 结构建议: - **步骤1:定义CollectionViewSource** - 解释CollectionViewSource的作用:它是CollectionView的包装器,用于在XAML中更方便地处理数据视图。 - **步骤2:为什么使用** - 允许在不修改原始数据源的情况下进行视图操作(排序、分组、过滤)。 - **步骤3:基本使用** - 在XAML中声明CollectionViewSource。 - 设置Source属性为数据源。 - 绑定ItemsSource到CollectionViewSource的View属性。 - **步骤4:具体功能** - 排序:如何使用SortDescriptions或自定义排序。 - 分组:使用GroupDescriptions。 - 过滤:使用Filter事件或属性。 - **步骤5:注意事项** - ItemsSource绑定而不是Items属性。 - CollectionViewSource只能用于ItemsSource绑定。 - **步骤6:示例代码** - 提供简单的XAML和C#代码片段。 - **步骤7:生成相关问题** 在回答中,引用提到的引用内容时,在末尾添加引用标识,如“[^1]”。 基于引用: - 从引用[1],CollectionView是一个映像,不会改变数据。 - 引用[2]讨论了添加动态筛选功能。 - 引用[3]显示了XAML绑定示例。 - 引用[4]提到了排序和分组。 我需要确保回答真实可靠,基于我的知识和这些引用。 最终回答使用中文。 </think> 以下是针对您问题的详细指南:《WPFCollectionViewSource使用方法》。CollectionViewSourceWPF数据绑定中的一个关键组件,用于在不修改原始数据源的前提下,对数据进行排序、分组或过滤操作。它本质上是CollectionView(列表视图)的前端代理,便于在XAML中直接配置视图逻辑,而非后台代码中处理[^1]。本指南将基于官方文档和最佳实践,结合引用内容,逐步解释其使用方法。 ### 一、CollectionViewSource的基本概念 CollectionViewSource(简称CVS)是一个封装类,主要有两个核心属性: - **Source**:绑定到原始数据集合(如 ObservableCollection<T> 或 List<T>)。 - **View**:提供处理后的视图对象(CollectionView类型),用于绑定到UI控件。 使用CVS的核心优势是:允许对同一数据源创建多个独立视图,实现不同展示需求(例如,一个列表显示过滤后的数据,另一个显示分组数据),而不影响底层数据[^1]。 ### 二、为什么需要使用CollectionViewSource? 默认情况下,当UI控件的ItemsSource绑定到数据集合时,WPF会自动生成一个CollectionView。但直接在XAML中操作这个默认CollectionView较困难。CollectionViewSource解决了此问题: - **分离视图逻辑**:将排序、分组、过滤逻辑封装在XAML或后台代码中,提升可维护性。 - **支持动态视图更新**:数据变化时(如添加新项),视图自动刷新。 - **简化绑定**:特别适合在复杂UI中实现多视图联动(如主从表)[^2][^4]。 ### 三、基本使用步骤(XAML + C#) 以下是一个完整示例,展示如何在WPF应用程序中使用CollectionViewSource实现数据绑定和基本操作。 #### 步骤1:在XAML中定义CollectionViewSource 首先,在资源中声明CollectionViewSource: ```xml <Window x:Class="MyApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"> <!-- 定义CollectionViewSource资源 --> <Window.Resources> <CollectionViewSource x:Key="MyCVS" Source="{Binding MyData}"> <!-- 可选:添加排序描述 --> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="Name" Direction="Ascending"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> </Window.Resources> <!-- 绑定到UI控件 --> <ListBox ItemsSource="{Binding Source={StaticResource MyCVS}, Path=View}" /> </Window> ``` 说明: - `Source="{Binding MyData}"`:MyData是后台的数据源(需实现INotifyPropertyChanged)。 - SortDescriptions用于排序(需引入`System.ComponentModel`命名空间)。 - 控件绑定到`Path=View`而非直接Source[^3][^4]。 #### 步骤2:在后台代码中设置数据源 在C#代码文件中,定义数据并绑定: ```csharp using System.Collections.ObjectModel; using System.Windows; public partial class MainWindow : Window { public ObservableCollection<Item> MyData { get; set; } public MainWindow() { InitializeComponent(); // 初始化数据源(示例数据) MyData = new ObservableCollection<Item> { new Item { Name = "Apple", Category = "Fruit" }, new Item { Name = "Carrot", Category = "Vegetable" }, new Item { Name = "Banana", Category = "Fruit" } }; // 设置数据上下文 DataContext = this; } } public class Item { public string Name { get; set; } public string Category { get; set; } } ``` 关键点: - 使用`ObservableCollection<T>`确保数据变化时视图自动更新。 - 数据源名(如`MyData`)必须与XAML中的绑定一致[^1][^2]。 ### 四、常用功能实现方法 CollectionViewSource支持三大核心操作:排序、分组、过滤。下面是具体实现指南。 #### 1. 排序 排序可在XAML或代码中定义: - **XAML方式**(如上步示例):使用SortDescriptions。 - **代码方式**(动态排序): ```csharp var collectionView = (CollectionViewSource)FindResource("MyCVS"); collectionView.View.SortDescriptions.Clear(); collectionView.View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Descending)); ``` #### 2. 分组 分组需添加GroupDescriptions: ```xml <CollectionViewSource x:Key="MyCVS" Source="{Binding MyData}"> <CollectionViewSource.GroupDescriptions> <PropertyGroupDescription PropertyName="Category"/> </CollectionViewSource.GroupDescriptions> </CollectionViewSource> ``` 在控件中显示分组(如ListBox): ```xml <ListBox ItemsSource="{Binding Source={StaticResource MyCVS}, Path=View}"> <ListBox.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" FontWeight="Bold"/> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ListBox.GroupStyle> </ListBox> ``` 说明:分组基于属性(如Category),UI需定义GroupStyle[^4]。 #### 3. 过滤 过滤通过Filter事件实现(支持动态筛选): - **在XAML中绑定事件**: ```xml <CollectionViewSource x:Key="MyCVS" Source="{Binding MyData}" Filter="OnFilter"/> ``` - **在代码中处理Filter事件**: ```csharp private void OnFilter(object sender, FilterEventArgs e) { var item = e.Item as Item; // 示例过滤:只显示Fruit类别 e.Accepted = (item.Category == "Fruit"); } ``` 动态更新过滤条件: ```csharp var collectionView = (CollectionViewSource)FindResource("MyCVS"); collectionView.View.Refresh(); // 重新应用过滤 ``` 此方法允许实时响应用户输入(如搜索框)[^2][^3]。 ### 五、注意事项 - **ItemsSource绑定**:必须绑定到`View`属性(如`ItemsSource="{Binding Source={StaticResource MyCVS}, Path=View}"`),而非直接Source或Items属性[^1]。 - **数据源类型**:最佳实践是使用`ObservableCollection<T>`,以确保变更通知。 - **性能优化**:对大列表,分组或过滤时考虑异步加载或虚拟化。 - **错误处理**:确保属性名在SortDescriptions或GroupDescriptions中正确,否则引发异常。 - **单一绑定限制**:ItemsSource和Items不能同时赋值;避免重复绑定同一数据源[^1][^3]。 ### 六、完整示例代码 下载完整项目示例:[GitHub Gist链接](https://gist.github.com/example)(模拟链接,实际开发请参考官方文档)。 通过以上步骤,您能高效实现数据视图管理。CollectionViewSourceWPF数据绑定的强大工具,特别适用于需要动态数据操作的场景[^1][^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值