我有一个带有DataGrid的窗口,我想根据ObservableCollection的内容隐藏某些列,而这个ObservableCollection是DataGrid的ItemSource。
基于这个问题: 根据绑定内容在xaml中使用条件元素
我写了一个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都是null。我期望这些列在数据网格中被隐藏,但它们仍然可见。我在VisbilityConverter中添加了一个断点,并通过调试器运行它,但看起来它并没有被调用。
DataGridColumn
直接从DependencyObject
派生而来,而不是从FrameworkElement
或FrameworkContentElement
派生,因此数据上下文不会被继承。请查看输出窗口,您应该能够在那里找到一个System.Windows.Data: Error: 2
的消息。 - Grx70