web-dev-qa-db-fra.com

WPF masquer la ligne dans la grille de données en fonction de la condition

J'ai besoin de masquer les lignes dans la grille de données en fonction des paramètres et des valeurs de la grille de données. Je pensais faire quelque chose comme ça;

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

Je ne peux pas comprendre comment masquer la ligne. Veuillez noter que je ne souhaite pas supprimer la ligne de la grille de données ou de la source de l'élément.

12
Xaphann

Si hideRow n'est pas un champ de la table (c'est-à-dire pas une colonne dans le 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>

Et réalisez Converter avec votre logique. Le type de la variable liée, AnyProp ci-dessus, sera votrePropertyType ci-dessous. AnyProp peut être n'importe quelle colonne de la ligne.

[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;
        }
    }


}

'valeur' ​​sera AnyProp, et il peut être utilisé dans la logique qui détermine si la ligne doit être affichée ou non, ou cette décision peut être basée sur autre chose, tel que 'hideRow' dans l'exemple.

19
progpow

Vous pouvez le faire dans Datagrid.ItemContainerStyle au lieu de le faire dans codebehind ...

  <DataGrid>
      <DataGrid.ItemContainerStyle>
            <Style TargetType="DataGridRow">
                 <Style.Triggers>
                       <DataTrigger Binding="{Binding PROPERTY}"  Value="VALUE">
                              <Setter Property="Visibility" Value="Collapsed"/>
9
Nitin

Utilisez un objet CollectionViewSource pour lier le DataGrid à vos données d’entreprise. CollectionViewSource déclenche un événement de filtre pour chaque ligne. Dans ce cas, votre code peut décider si la ligne doit être affichée.

Ajoutez à votre XAML:

<Window.Resources>
  <CollectionViewSource x:Key="sampleViewSource" CollectionViewType="ListCollectionView"/>
</Window.Resources>

<DataGrid DataContext="{StaticResource sampleViewSource}" ItemsSource="{Binding}"
            AutoGenerateColumns="False">

Ajoutez ce qui suit à votre code derrière le fichier:

stocksViewSource = ((System.Windows.Data.CollectionViewSource)(FindResource("sampleViewSource")));
sampleViewSource.Filter += sampleViewSource_Filter;

Créez le gestionnaire d'événements de filtre. Vous pouvez obtenir les données de ligne de e.Item. En définissant e.Accepted, vous pouvez contrôler si la ligne doit être affichée.

2
Peter Huber
<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 est une classe qui implémente IValueConverter. Voici la classe ...

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;
  }
}
1
Priyanka