データグリッドのパラメーターと値に基づいて、データグリッドの行を非表示にする必要があります。私はこのようなことをすることを考えました。
foreach (System.Data.DataRowView dr in myDataGrid.ItemsSource)
{
//Logic to determine if Row should be hidden
if (hideRow == "Yes")
{
//Hide row code
}
}
行を実際に非表示にする方法がわかりません。データグリッドまたはアイテムソースから行を削除したくないことに注意してください。
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'など、他のものに完全に基づくことができます。
これを分離コードで行う代わりに、Datagrid.ItemContainerStyleで行うことができます...
<DataGrid>
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding PROPERTY}" Value="VALUE">
<Setter Property="Visibility" Value="Collapsed"/>
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を設定すると、行を表示するかどうかを制御できます。
<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;
}
}