2013-10-11 200 views
12

DataGridのパラメータと値に基づいて、DataGridの行を非表示にする必要があります。私はこのようなことをやろうと思った。条件に基づいたWPF DataGridの行を非表示

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

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

答えて

17

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


} 

「の値が」AnyPropになり、そしてそれは、そのような中「hideRow」として、行を表示するか否かを判定し、またはその決定は完全に何か他のものに基づいて行うことができるロジックで使用することができます例。

+1

「hideRowはテーブルのフィールドではない」とは何を意味するのか分かりません。申し訳ありませんが、英語は母国語ではなく、間違った文法のために私には意味がありません。 – WoIIe

+0

以下のコードの 'hideRow'は偽の変数です。本当にそれはあなたが実装する必要があるカスタムロジックです。 – progpow

+0

ありがとう、これは正しい軌道に乗った。 @Wolle私はそれを修正しようとしました、うまくいけばそれは意図された方法で。 IValueConverter.ConvertBackメソッドを追加する必要がありました。そうしないとコンパイルされませんでした。その周りに何らかの方法があるかどうかわかりません。私にとって最後のことではありませんでしたが、1つのフィールドだけでなく、バ​​インドされた行オブジェクト全体を渡すことが可能かどうか疑問に思っていました。 – njplumridge

8

あなたは

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

は、あなたのビジネスデータをデータグリッドをリンクするCollectionViewSourceを使用して...代わりに、分離コードでそれを行うのDatagrid.ItemContainerStyleでこれを行うことができます。 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; 

フィルタのEventHandlerを作成します。 e.Itemから行データを取得できます。 e.Acceptedを設定すると、行を表示するかどうかを制御できます。

関連する問題