DataGridのItemSourceであるObservableCollectionの内容に基づいて特定の列を非表示にするDataGridがあるウィンドウがあります。この質問に基づいて列の値に基づいてDataGrid列を非表示にする
: Conditional element in xaml depending on the binding content
私はVisibilityConverterを書いた:ここ
public class StringLengthVisiblityConverter : IValueConverter
{
public StringLengthVisiblityConverter() { }
public Object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || value.ToString().Length == 0)
{
return Visibility.Collapsed;
}
else
{
return Visibility.Visible;
}
}
public Object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
はXAMLです:
<DataGrid.Resources>
<local:StringLengthVisiblityConverter x:Key="VisConverter"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Switch Port" Binding="{Binding FCPort}"/>
<DataGridTextColumn Width="*" Header="WWPN" Binding="{Binding Path=WWPN}"
Visibility="{Binding Path=WWPN, Converter={StaticResource VisConverter}}"/>
<DataGridTextColumn Header="FCID" Binding="{Binding Path=FCID}"
Visibility="{Binding Path=FCID, Converter={StaticResource VisConverter}}"/>
</DataGrid.Columns>
</DataGrid>
私はどこのクラスのインスタンスでコレクションをロードWWPNとFCIDは両方ともヌルです。私はそれらの列がデータグリッド内に隠されることを期待しましたが、まだ見えていました。私はVisbilityConverterにブレークポイントを追加し、デバッガを介してそれを実行しましたが、呼び出されるように見えません。
すべての項目が空の文字列またはnullの場合は、完全な列を非表示にしますか?その後、アイテムにバインドして(パスを空にして)アイテムを繰り返し処理するMultiValueConverterを作成できます。 – WPFGermany
これは、 'DataGridColumn'が' FrameworkElement'や 'FrameworkContentElement'ではなく' DependencyObject'から直接派生しているため、データコンテキストが継承されないからです。出力ウィンドウをチェックすると、そこに 'System.Windows.Data:Error:2'メッセージがあるはずです。 – Grx70
[ここには良い記事があります](https://blogs.msdn.microsoft.com/jaimer/2008/11/22/forwarding-the-datagrids-datacontext-to-its-columns/)の説明と回避策があります正確な問題。 – Grx70