我需要根据datagrid中的参数和值隐藏datagrid中的行。我想做这样的事情;
foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource)
{
//Logic to determine if Row should be hidden
if (hideRow == "Yes")
{
//Hide row code
}
}
我只是无法想象如何实际隐藏行。请注意我不想从数据网格或项目源中删除行。
答案 0 :(得分:20)
如果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>
用您的逻辑实现Converter。上面的绑定变量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'。
答案 1 :(得分:10)
您可以在Datagrid.ItemContainerStyle中执行此操作,而不是在代码隐藏中执行此操作...
<DataGrid>
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding PROPERTY}" Value="VALUE">
<Setter Property="Visibility" Value="Collapsed"/>
答案 2 :(得分:2)
使用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,您可以控制是否应显示该行。
答案 3 :(得分:2)
<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;
}
}