Отображение видимости столбцов 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 ListView повторяющимися по горизонтали, например, горизонтальной полосой прокрутки?
  • Имеет ли XAML условную директиву компилятора для режима отладки?
  • Внедрить INotifyPropertyChanged в сгенерированные classы Entity Framework
  • Как WPF UserControl наследует WPC UserControl?
  • Связывание RelativeSource с помощью ToolTip или ContextMenu
  • Ошибка ReSharper WPF: «Не удается разрешить символ« MyVariable »из-за неизвестного DataContext»
  • Как растянуть WPF вкладку Элементы заголовка к размеру родительского контроля
  • WPF TreeView: как стилизовать выбранные элементы с закругленными углами, как в Explorer
  • Связывание со статическим свойством
  • Разница между SelectedItem, SelectedValue и SelectedValuePath
  • Навигация по страницам с помощью MVVM в приложении Store
  • Давайте будем гением компьютера.