列表隐藏某一行,几种方法
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即可