在WPF中应用过滤器后,teleerik网格不刷新

本文关键字:teleerik 网格 刷新 WPF 应用 过滤器 | 更新日期: 2023-09-27 18:02:17

我正在删除网格中的一行,当用户单击删除按钮时,集合中的属性IsDeleted更改为true,因此.xaml页面中的过滤器将属性绑定到telerik grid

//代码过滤器:

 <telerik:RadGridView.FilterDescriptors>
           <telerik:FilterDescriptor Member="IsDeleted" Operator="IsEqualTo" Value="False"/>
 </telerik:RadGridView.FilterDescriptors>

ViewModel:

 if (this.IsNPISItemSelected && MessageBox.Show("Are you sure that you want to delete the selected npis item?", "Delete NPIS Item", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    this.SelectedNPISItem.IsDeleted = true;

                }

绑定显示数据表格:

 <telerik:RadGridView x:Name="grdNPISItem" ItemsSource="{Binding NPISItemsCollection, Mode=TwoWay}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedNPISItem, Mode=TwoWay, Source={StaticResource NPISViewModel}}" 
                                HorizontalAlignment="Stretch" telerik:StyleManager.Theme="Windows8"
                                Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type telerik:RadGridView}}, Path=ActualWidth, Converter={StaticResource PercentageConverter}, ConverterParameter=0.98}" 
                                GridLinesVisibility="Both">

但是现在,当我删除行它仍然显示。问题是,如果属性为false,则行不应显示在网格中。

我猜网格没有刷新。

我错在哪里?

在WPF中应用过滤器后,teleerik网格不刷新

显然,RadGridView不把属性更改作为更新过滤器的理由。您可以测试并看到,如果您通过网格本身更新值,那么过滤将正常进行,因为正确的网格编辑过程已经完成。

简单的解决方案是在ViewModel中引发一些自定义事件,通知View应该更新过滤器:

grdNPISItem.FilterDescriptors.Reset();

但我认为它可以更好地将逻辑移动到ViewModel,使一个集合与现有的值,并将其绑定到网格:

 public IEnumerable<NPISItem> ExistingNPISItemsCollection
  {
     get
     {
        return NPISItemsCollection == null 
                   ? Enumerable.Empty<NPISItem>() 
                   : NPISItemsCollection .Where(d => !d.IsDeleted);
     }
  }

然后当你改变IsDeleted属性时,你只需调用PropertyChanged为这个集合和网格将拾取它。这也允许保持网格列过滤,以便用户可以按照自己的喜好处理显示的项目。

这里的null检查是在绑定发生时集合尚未初始化的情况下,所以如果你不需要它,你可以删除它,或者在NPISItemsCollection setter中为这个集合调用PropertyChanged。