Есть ли способ временно отсоединить привязку в WPF? - PullRequest
1 голос
/ 31 августа 2009

Справочная информация:

У меня есть ListView / GridView с несколькими столбцами. В некоторых ситуациях отображаются только некоторые столбцы. Так как в WPF нет свойства Visible для GridViewColumns, я устанавливаю ширину столбцов, которые я хочу скрыть, равной нулю. Визуально это дает желаемый эффект (и я на самом деле изменил ControlTemplate для GridViewColumnHeader, чтобы пользователь не смог случайно раскрыть скрытые столбцы).

Проблема:

Проблема заключается в том, что привязки для скрытых столбцов все еще находятся в игре, и они пытаются найти данные, которые не существуют. В этом случае это вызывает IndexOutOfRangeException, так как он пытается найти имя столбца, который не существует в DataTable, с которым он связан.

Вопрос:

Как временно отключить или отключить привязку для скрытых столбцов? Или, пожалуйста, предложите лучшее решение, если у вас есть.

Спасибо!

1 Ответ

2 голосов
/ 31 августа 2009

Ах, я думаю, у меня это есть. 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 согласно предложению Денниса Роша.

...