Привязать свойство видимости 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}}"/>