web-dev-qa-db-ja.com

WPFは条件に基づいてデータグリッドの行を非表示にします

データグリッドのパラメーターと値に基づいて、データグリッドの行を非表示にする必要があります。私はこのようなことをすることを考えました。

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

行を実際に非表示にする方法がわかりません。データグリッドまたはアイテムソースから行を削除したくないことに注意してください。

19
Xaphann

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'など、他のものに完全に基づくことができます。

20
progpow

これを分離コードで行う代わりに、Datagrid.ItemContainerStyleで行うことができます...

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

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を設定すると、行を表示するかどうかを制御できます。

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は、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;
  }
}
2
Priyanka