我需要根据数据网格中的参数和值隐藏数据网格中的行。我想做这样的事情;
foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource)
{
//Logic to determine if Row should be hidden
if (hideRow == "Yes")
{
//Hide row code
}
}
我只是不知道如何实际隐藏该行。请注意,我不想从数据网格或项目源中删除行。
我需要根据数据网格中的参数和值隐藏数据网格中的行。我想做这样的事情;
foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource)
{
//Logic to determine if Row should be hidden
if (hideRow == "Yes")
{
//Hide row code
}
}
我只是不知道如何实际隐藏该行。请注意,我不想从数据网格或项目源中删除行。
如果 hideRow 不是表的字段(即不是 DataGridRow 中的列):
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding AnyProp, Converter={StaticResource hiddenConverter}}" Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
并用您的逻辑实现转换器。绑定变量的类型,上面的 AnyProp,将是下面的 yourPropertyType。AnyProp 可以是行中的任何列。
[ValueConversion(typeof(yourPropType), typeof(bool))]
public class hiddenConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (hideRow == "Yes")
{
return true;
}
else
{
return false;
}
}
}
'value' 将是 AnyProp,它可以用于确定是否显示该行的逻辑,或者该决定可以完全基于其他内容,例如示例中的“hideRow”。
You can do this in Datagrid.ItemContainerStyle instead of doing it in codebehind...
<DataGrid>
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding PROPERTY}" Value="VALUE">
<Setter Property="Visibility" Value="Collapsed"/>
使用 CollectionViewSource 将 DataGrid 与您的业务数据链接起来。CollectionViewSource 为每一行触发一个过滤器事件。在这种情况下,您的代码可以决定是否应显示该行。
添加到您的 XAML:
<Window.Resources>
<CollectionViewSource x:Key="sampleViewSource" CollectionViewType="ListCollectionView"/>
</Window.Resources>
<DataGrid DataContext="{StaticResource sampleViewSource}" ItemsSource="{Binding}"
AutoGenerateColumns="False">
将以下内容添加到您的代码隐藏文件中:
stocksViewSource = ((System.Windows.Data.CollectionViewSource)(FindResource("sampleViewSource")));
sampleViewSource.Filter += sampleViewSource_Filter;
创建过滤器事件处理程序。您可以从 e.Item 获取行数据。通过设置 e.Accepted,您可以控制是否应显示该行。
<Window x:Class="ProjectName.ClassName"
xmlns:C="clr-namespace:ProjectName.FolderName"> //Folder containing 'VisibilitySetter' class.
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
<Window.Resources>
<C:VisibilitySetter x:Key="VisibilitySetter" />
</Window.Resources>
<DataGrid ItemsSource="{Binding SomeObservableCollectionProperty}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Visibility" Value="{Binding Path=., Converter={StaticResource VisibilitySetter}, ConverterParameter=1}" />
</Style>
</DataGrid.RowStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding PropertyName1}" />
<DataGridTextColumn Binding="{Binding PropertyName2}" />
//................
</DataGrid>
</Window >
VisibilitySetter 是一个实现 IValueConverter 的类。这里是类...
public class VisibilitySetter:IValueConverter
{
public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
{
if(parameter.ToString() == "1") //Parameter is set in the xaml file.
{
return SetVisibilityBasedOn(value);
}
return null;
}
private object SetVisibilityBasedOn(object value)
{
if(value is SomeObject obj && obj.value == "SomeValue") //Checks the value of the object
{
return Visibility.Collapsed; //Hides the row. It Returns visibility based on the value of the row.
}
return null;
}
}