2009-08-31 3 views
1

фона:Есть ли способ временно отсоединить привязку в WPF?

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

Проблема:

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

Вопрос:

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

Спасибо!

ответ

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> 

EDIT

Изменение возвращаемого значения преобразователя в тех случаях, когда имя столбца находится вне диапазона от String.Empty до Binding.DoNothing на предложение Дениса Рош.

+0

Я согласен, что это хорошее решение вашей проблемы. Единственное, что я хотел бы сделать, это изменить return String.Empty, чтобы вернуть Binding.DoNothing. – Dennis

+0

Хорошая идея, спасибо! – devuxer

Смежные вопросы