【发布时间】:2016-11-16 03:26:16
【问题描述】:
我有一个带有 DataGrid 的窗口,我想根据作为 DataGrid 的 ItemSource 的 ObservableCollection 的内容隐藏某些列。
基于这个问题: 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 中添加了一个断点并通过调试器运行它,但它看起来不像被调用。
【问题讨论】:
-
如果所有项目都是空字符串或空值,您想隐藏整个列吗?然后你可以绑定到项目(让路径为空)并创建一个 MultiValueConverter 迭代你的项目。
-
这是因为
DataGridColumn直接派生自DependencyObject而不是FrameworkElement或FrameworkContentElement,因此数据上下文没有被继承。查看输出窗口,您应该可以在那里找到System.Windows.Data: Error: 2消息。 -
Here's a good article 为您的确切问题提供解释和解决方法。
-
@Grx70 - 谢谢。这回答了这个问题。