在WPF中应用过滤器后,Telerik Grid不会刷新

时间:2014-05-07 06:47:06

标签: c# wpf mvvm telerik telerik-grid

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

//代码

过滤器:

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

视图模型:

 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;


                }

绑定GridView:

 <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,则行不应显示在网格中。

我猜网格并不令人耳目一新。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

显然,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,网格就会将其选中。这也允许保持网格列过滤,以便用户可以随意使用所显示的项目。

此处的空检查是在绑定发生时尚未初始化集合的情况下,因此如果您不需要它,可以将其删除,或者在NPISItemsCollection setter中为此集合调用PropertyChanged。