我使用ICollectionView
作为ItemsSource
DataGrid
。使用Style
,我突出显示包含特定DataGrid
的{{1}}的单元格。同时我想过滤SearchString
以显示包含至少一个与我的搜索匹配的单元格的行。
要DataGrid
影响ICollectionView.Filter
中显示的数据,我需要调用DataGrid
,这显然会清除单元格的样式,因为整个数据会重新加载并显示新鲜。
在ICollectionView.Refresh()
之后保留(或重新应用)单元格样式的方法是什么?
以下是我用来设置单元格样式的代码:
ICollectionView.Refresh()
以下是我如何过滤<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ContainsStringToBooleanConverter}">
<Binding Path="Content" RelativeSource="{RelativeSource Self}"/>
<Binding Path="DataContext.SearchString" RelativeSource="{RelativeSource AncestorType={x:Type Window}}"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="LightGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
:
ICollectionView
...
ItemView = CollectionViewSource.GetDefaultView(myItemChildren);
ItemView.Filter = ItemViewFilter;
每次private bool ItemViewFilter(object o)
{
if (String.IsNullOrWhiteSpace(SearchString)) return true;
var item = (o as Item);
if (item == null) return true;
bool result = (item.ItemText.ToLower().Contains(SearchString.ToLower()));
return result;
}
更新时都会调用{p> Refresh()
:
SearchString
修改
在mm8的评论之后,我看了一下我的public string SearchString
{
get
{
return mySearchString;
}
set
{
mySearchString = value;
ItemView.Refresh();
OnPropertyChanged("SearchString");
}
}
。似乎在IMultiValueConverter
之后调用转换器时,没有任何单元格包含任何文本。这是我的转换器:
Refresh
答案 0 :(得分:0)
我从我的“过滤器和样式”方法切换到突出显示单元格并仅显示包含此类突出显示的单元格的行到仅样式方法。
我添加了一个额外的DataGrid.RowStyle
来隐藏不包含我的搜索字符串的行:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ContainsStringToBooleanConverter}">
<Binding Path="." RelativeSource="{RelativeSource Self}"/>
<Binding Path="DataContext.SearchString" RelativeSource="{RelativeSource AncestorType={x:Type Window}}"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
这很好用,我觉得它甚至可能比过滤器方法快一点。