Ах, я думаю, у меня это есть. 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>
EDIT
Измените возвращаемое значение преобразователя в тех случаях, когда имя столбца выходит за пределы диапазона от строки. Пусто до Binding.DoNothing согласно предложению Денниса Роша.