在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,则行不应显示在网格中。
我猜网格没有刷新。
我错在哪里?
显然,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。