WPF DataGrid - Скрывающийся Столбец с помощью CheckBox

Я пытаюсь управлять видимостью столбца с помощью флажка (это находится в WPF 4.0).

Вот отрывок моего XAML:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>

<CheckBox x:Name="GeneralDetailsVisible" Content="General Details"  Margin="5"/>

<DataGridTextColumn Header="Crew" 
  Binding="{Binding Path=Crew}" 
  Visibility="{Binding ElementName=GeneralDetailsVisible, 
                       Converter={StaticResource BoolToVisConverter}, 
                       Path=IsChecked}">
</DataGridTextColumn>

Теперь я знаю, что преобразователь BooleanToVisibilityConverter работает, когда я связал его с текстовым блоком, и я вижу значения, которые я ожидаю. Если я ввожу значения вручную в свойство видимости столбцов, оно работает. Но не, когда я связываю его. Что я делаю неправильно?

Ответ:

Quartermeister указал на меня на ответ. Страница, на которую он указал, является немного вводящей в заблуждение, поскольку код, перечисленный на сообщении, не работает, и необходимо посмотреть на пример кода.

Вот мой финал, рабочий код, для кого-либо еще, кто сталкивается с этой проблемой:

Преобразователь для превращения нашего свойства ViewModels bool в корректную Видимость оценивает за наш атрибут столбца.

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>

Свяжите флажок со свойством ViewModels, которое будет управлять столбцами visibiity.

<CheckBox
  x:Name="DetailsVisible" 
  Content="Show Details"
  IsChecked="{Binding Path=DisplayDetails}" />

Затем свяжите Видимость со свойством ViewModels DisplayDetails. Заметьте, что это - столбцы собственный DataContext, который связывается с.

<DataGridTextColumn
  Header="Reliability" 
  Binding="{Binding Path=Reliability}" 
  Visibility="{Binding (FrameworkElement.DataContext).DisplayDetails, 
                       RelativeSource={x:Static RelativeSource.Self}, 
                       Converter={StaticResource BoolToVisConverter}}">
</DataGridTextColumn>

Добавьте следующий код к своему проекту, это позволяет ловлю изменения в DataGrids DataContext.

FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));

FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid),
        new FrameworkPropertyMetadata
           (null, FrameworkPropertyMetadataOptions.Inherits,
           new PropertyChangedCallback(OnDataContextChanged))); 

Затем каждый раз, когда Ваш DataGrids DataContext изменяется, мы обновляем весь приложенный DataGridColumsn с новым DataContext.

public static void OnDataContextChanged(DependencyObject d,
                                        DependencyPropertyChangedEventArgs e)
{
    DataGrid grid = d as DataGrid;
    if (grid != null)
    {
        foreach (DataGridColumn col in grid.Columns)
        {
            col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);
        }
    }
}

Один Глюк для внимательности. Если Вы добавляете свой DataContext к Вашей странице как так:

<Window.DataContext>
    <vm:WeaponListViewModel />
</Window.DataContext>

Затем вышеупомянутая функция будет вызвана, прежде чем Ваш DataGrid имеет любые столбцы!

Я обошел это путем ручного присоединения моего DataConext в коде позади после того, как окно было создано.

8
задан Rincewind 10 July 2010 в 00:43
поделиться

1 ответ

Проблема в том, что колонки DataGrid не являются частью визуального дерева, поэтому они не могут использовать привязки. (Свойство "Binding" на самом деле является обычным свойством типа Binding, а не свойством зависимости. Оно применяет этот объект привязки к ячейкам, которые являются частью визуального дерева.)

Вот ссылка на блог, в котором есть обходной путь и демонстрируется привязка видимости столбца к флажку: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

3
ответ дан 5 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: