我正在删除网格中的一行,当用户点击删除按钮时,集合中的属性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,则行不应显示在网格中。
我猜网格并不令人耳目一新。
我哪里错了?
答案 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。