WPF ListView 列表

列表隐藏某一行,几种方法

1、使用CollectionViewSource过滤器,这种方法在需要隐藏某一行刷新的时候不完美,model和view由混在一起了

csharp 复制代码
<!--xaml中代码-->
<Window.Resources>
    <converter:IndexConverter x:Key="idxcvt"/>
	
	<!--列表过滤器-->
    <CollectionViewSource x:Key="FilteredItems" Source="{Binding ListChipInfos}" Filter="ListItem_Filter">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="State" Direction="Ascending"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
    
    <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
    	<Setter Property="HorizontalContentAlignment" Value="Center"/>
    	<!--对应方法3-->
    	<Setter Property="Visibility" Value="{Binding IsVisible}"/>
	</Style>
</Window.Resources>

<ListView Grid.Row="0" Grid.Column="0" Grid.RowSpan="6" x:Name="ltShowChip"
		  FontSize="16" Height="280" Opacity="0.8"
		  HorizontalAlignment="Center"
		  VerticalAlignment="Top"
		  ItemContainerStyle="{StaticResource ListViewItemStyle}"
		  ItemsSource="{Binding Source={StaticResource FilteredItems}}">
	<ListView.View>
		<GridView>
			<GridViewColumn Header="序号" Width="40"
					DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource idxcvt}}"/>
			<GridViewColumn Header="芯片ID" Width="Auto" DisplayMemberBinding="{Binding Path=sensor_chip_id}" />
			<GridViewColumn Header="日期" Width="100" DisplayMemberBinding="{Binding Path=date}" />
		</GridView>
	</ListView.View>
</ListView>

//cs代码
//列表序号转换器
public class IndexConverter : IValueConverter
{
	public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
	{
		ListViewItem item = (ListViewItem)value;
		ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
		int index = listView.ItemContainerGenerator.IndexFromContainer(item) + 1;
		return index.ToString();
	}

	public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		throw new NotImplementedException();
	}
}

public class ChipInfo:INotifyPropertyChanged
{
	public event PropertyChangedEventHandler PropertyChanged;
	
	public string sensor_chip_id { get; set; } //芯片ID
	public long date_write { get; set; } = (DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0, 0).Ticks) / 10000; //时间戳
	public bool IsVisible{get;set;}
	//private Visibility mIsVisible = Visibility.Visible; //方法3
	//public Visibility IsVisible
	//{
	//	get => mIsVisible;
	//	set
	//	{
	//		mIsVisible = value;
	//		PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsVisible)));
	//	}
	//}
}

private void ListItem_Filter(object sender, System.Windows.Data.FilterEventArgs e)
{
	if (e.Item is ChipInfo item)
	{
		e.Accepted = item.IsVisible;
	}
}
	
Dispatcher.InvokeAsync(() => 
{ 
	CollectionViewSource vs = (CollectionViewSource)Resources["FilteredItems"];
	if (vs != null)
	{
		vs.View.Refresh();//刷新
	}
});

2、方法笨办法,直接把删除绑定列表数据

csharp 复制代码
List<ChipIdInfo>ChipInfos=[]; //全部数据
ObservableCollection<ChipIdInfo> ListChipInfos=[]; //列表绑定对象
//过滤数据后重置列表绑定
ListChipInfos = new ObservableCollection<ChipIdInfo>(ChipInfos);

3、通过修改 ListViewItem 样式来实现隐藏/显示某一行,这种方法几百条数据没卡顿,效果好,不过每行都绑定一个数据,开销大,数据太多可能就不好了,几天条数据显示会卡顿,不过搜索还好,就是不知道1万条数据咋样

在搜索时只需要设置 IsVisible=Visibility.Collapsed/Visible即可

相关推荐
码界奇点8 小时前
基于eBPF技术的高性能网络防火墙系统设计与实现
开发语言·网络·毕业设计·php·wpf·go语言·源代码管理
cjp56012 小时前
022.WPF 封装TextBox控件限制只输入数字自定义属性
wpf
cjp56012 小时前
021.WPF 以MVVM模式控制combox控件显示/隐藏
wpf
小北方城市网1 天前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf
流水线上的指令侠1 天前
补充说明——针对《C#:从 0 到 1 创建基于 NUnit + FlaUI 的 WPF UI 自动化测试项目》
功能测试·ui·c#·自动化·wpf
流水线上的指令侠1 天前
C# 实战:从 0 到 1 搭建基于 NUnit + FlaUI 的 WPF UI 自动化测试项目
功能测试·ui·c#·自动化·wpf·visual studio
贾修行1 天前
.NET 全栈开发学习路线:从入门到分布式
c#·.net·wpf·asp.net core·web api·winforms·services
晓13131 天前
第四章:Redis实战应用及常见问题(下篇)
java·数据库·缓存·wpf
掘根2 天前
【jsonRpc项目】客户端的Requestor模块,RpcCaller模块
wpf
FuckPatience3 天前
WPF ListBoxItem绑定自己在ListBox中的顺序
wpf