背景
我有一个ListView
/ GridView
,其中有几列。在某些情况下,只显示一些列。由于WPF中Visible
没有GridViewColumns
属性,因此我将要隐藏的列的宽度设置为零。在视觉上,这实现了预期的效果(我实际上修改了ControlTemplate
的{{1}},这样用户就不可能意外地扩展任何隐藏的列。)
问题:
问题是隐藏列的绑定仍在使用中,他们正在尝试查找不存在的数据。在这种情况下,它会导致GridViewColumnHeader
,因为它正在尝试查找它所绑定的IndexOutOfRangeException
上不存在的列名。
问题:
如何暂时禁用或分离隐藏列的绑定?或者如果你有一个更好的解决方案,请提出建议。
谢谢!
答案 0 :(得分:2)
IValueConverter
救援。
这是我提出的解决方案,以防其他人遇到同样的问题:
步骤1.创建转换器。
此IValueConverter
检查索引是否超出范围,如果是,则返回空字符串。请注意,我使用转换器的parameter
来保存列名称。
public class DataRowViewToCellString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DataRowView row = (DataRowView)value;
string columnName = (string)parameter;
if (row.DataView.Table.Columns.Contains(columnName))
return row[columnName].ToString();
else
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
步骤2.将转换器转换为DataTemplate
。
<local_converters:DataRowViewToCellString
x:Key="TaskWindow_DataRowViewToCellString" />
<DataTemplate
x:Key="TaskWindow_Column4Template">
<TextBlock
Text="{Binding Converter={StaticResource TaskWindow_DataRowViewToCellString}, ConverterParameter=Column4}" />
</DataTemplate>
步骤3.在“有时隐藏的”GridViewColumn
中引用模板。
<ListView ... >
<ListView.View>
<GridView ... >
...
<GridViewColumn
Header="SometimesHiddenColumn"
CellTemplate="{StaticResource TaskWindow_Column4Template}">
</GridView>
</ListView.View>
</ListView>
修改强>
根据Dennis Roche的建议,在列名超出string.Empty到Binding.DoNothing的情况下,更改转换器的返回值。