Отображение видимости столбцов Bind datagrid MVVM

.Net 3.5

Я знаю, что столбцы не наследуют datacontext и, читая другие сообщения, я думал, что это сработает:

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" 

Однако, конечно, этого не происходит. Окно вывода не жалуется, кажется, что ресурс, который я нашел, но свойство viewmodel, называется более новым.

Это весь DG:

                      

Я прочитал почти все решения этой проблемы, и ничего не работает.

DataGridColumn s не являются частью визуального дерева, поэтому они не связаны с контекстом данных DataGrid .

Для их совместного использования используйте прокси-элементный подход, подобный этому …

  1. Добавьте прокси-элемент FrameworkElement в Resources вашей группы предков.
  2. Передайте его в невидимый ContentControl связанный с его Content .
  3. Используйте этот ProxyElement как StaticResource для источника контекста данных в привязке видимости.

                 

Помимо DataGridColumn , вышеупомянутый подход отлично подходит для подключения DataContext к Popup и ContextMenu (т.е. любого элемента, который не связан с визуальным деревом).

Пользователи Silverlight

Печально настроенное содержимое элементов управления содержимым с любыми элементами структуры не допускается в silverlight. Таким образом, обходной путь был бы (это всего лишь код наведения для silverlight) …

  1. Измените ресурс элемента структуры на что-то легкое, как Textblock . (Silverlight не позволяет указать статический ресурс типа FrameworkElement .)

       
  2. Напишите прикрепленное свойство для хранения текстового блока против элемента управления содержимым.

      
  3. В зависимом атрибуте зависимого свойства обработчик события установите привязку контекста данных элемента управления содержимым к текстовому блоку.

      private static void OnProxyElementPropertyChanged( DependencyObject depObj, DependencyPropertyChangedEventArgs e) { if (depObj is ContentControl && e.NewValue is TextBlock) { var binding = new Binding("DataContext"); binding.Source = depObj; binding.Mode = OneWay; BindingOperations.SetBinding( (TextBlock)e.NewValue, TextBlock.DataContextProperty, binding); } } 

Таким образом, текстовый блок не может быть связан с визуальным деревом, но, вероятно, будет знать об изменениях контекста данных.

Надеюсь это поможет.

  • Как связать WPF DataGrid с переменным числом столбцов?
  • Привязать к методу в WPF?
  • Взаимоисключающие элементы меню?
  • Загрузка XAML во время выполнения?
  • Связывание в WPF с элементом массива, заданным свойством
  • Можете ли вы определить несколько TargetTypes для одного стиля XAML?
  • Как сделать элементы WPF ListView повторяющимися по горизонтали, например, горизонтальной полосой прокрутки?
  • Как растянуть WPF вкладку Элементы заголовка к размеру родительского контроля
  • Что означает «{x: Static}» в XAML?
  • Как создать пользовательский элемент управления WPF с содержимым NAMED
  • наследовать стиль от стиля по умолчанию
  • Interesting Posts
    Давайте будем гением компьютера.