Привязать свойство видимости DataGridTextColumn в WPF

У меня есть датагрид, чьи ItemsSource привязывается к CollectionViewSource,
В каждом столбце я указываю Path свойство привязки для получения конкретной информации для отображения.

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

<DataGrid ItemsSource="{Binding Source={StaticResource cvs}}" ....>
    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"
            Visibility="{Binding IsChecked,
                                 ElementName=IncludeFullHist, 
                                 Converter={StaticResource boolItemsConverter}}"/>   
    </DataGrid.Columns>
</DataGrid>

Мне нужен флажок в моей viewmodel, так что у меня есть его IsChecked свойство привязано к свойству на моей модели представления

<CheckBox x:Name="IncludeFullHist"  IsChecked="{Binding Path=ManagerFullHist }" />

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

<TextBlock DockPanel.Dock="Left" Text=" Visible 2 " 
    Visibility="{Binding Path=DataContext.ManagerFullHist,
                         RelativeSource={RelativeSource FindAncestor,
                         AncestorType={x:Type UserControl}},
                         Converter={StaticResource boolItemsConverter}}"/>
<TextBlock DockPanel.Dock="Left" Text=" Visible 3 " 
    Visibility="{Binding Path=ManagerFullHist, 
                         Source={StaticResource mainWinResource},
                         Converter={StaticResource boolItemsConverter}}"/>

Любые предложения о том, как я могу решить эту проблему в сетке данных?
Пожалуйста, дайте мне знать, если я пропустил какой-либо код, который мог бы быть потенциально полезным.

1 ответ

Решение

DataGridColumn на самом деле не является частью VisualTreeпоэтому привязки к классу не могут найти их источник

Вы можете установить такие вещи, как Visibility а также Width недвижимость в CellStyle или же HeaderStyle из DataGridColumnхотя это не совсем то же самое.

Самое близкое к решению, которое я нашел, было бы создать объект Freezable в вашем <DataGrid.Resources> который хранит привязку, а затем использовать StaticResource в Visibility связывание. Это не симпатичное решение, но это единственное, что я могу найти в это время.

Вы можете посмотреть пример этого здесь

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding IsChecked, 
         ElementName=IncludeFullHist, 
         Converter={StaticResource boolItemsConverter}}" />
</DataGrid.Resources>

<DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"
    Visibility="{Binding Path=Data, Source={StaticResource proxy}}"/>  
Другие вопросы по тегам