24

我需要根据数据网格中的参数和值隐藏数据网格中的行。我想做这样的事情;

foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource)
{
   //Logic to determine if Row should be hidden
   if (hideRow == "Yes")
   {
      //Hide row code
   }
}

我只是不知道如何实际隐藏该行。请注意,我不想从数据网格或项目源中删除行。

4

4 回答 4

28

如果 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”。

于 2013-10-11T14:34:31.743 回答
12

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"/>
于 2013-10-11T14:40:34.570 回答
4

使用 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,您可以控制是否应显示该行。

于 2013-11-24T07:58:08.963 回答
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;
  }
}
于 2019-01-15T17:04:47.820 回答