2012-08-27 2 views
3

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

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

<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 привязан к собственности на моем ViewModel

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

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

<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}}"/> 

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

+0

@Rachel Рахиль, спасибо за Ваш ответ! Это точная проблема, с которой я столкнулся. Я чувствую себя намного ближе, но привязка все еще не работает. Я создал класс 'BindingProxy' в соответствии с связанной статьей. «DataContext» для моего пользовательского элемента управления установлен в мой класс ViewModel, и мой datagrid наследует его datacontext. Я попытался поместить ресурс «proxy» в свой datagrid и мой пользовательский элемент управления и попытался привязать к 'Path = DataContext.ManagerFullHist' и к свойству' IsChecked' 'ElementName = IncludeFullHist', и ни одна из них не работает. Является ли datacontext для моего контроля запутыванием вещей? – KyleMit

+0

@ Rachel, Еще раз спасибо за ваш ответ. Я заработал. Проблема заключалась в том, что на моем конце была какая-то глупость, где я пытался ухватить DataContext одним из моих других обходных решений, предоставив ему атрибут x: Key (''), который каким-то образом мешал информационный тезис. В любом случае решение работает как отправлено. Спасибо! – KyleMit

+0

Рад, что вы все разобрались :) – Rachel

ответ

9

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

Вы можете установить такие вещи, как собственность в CellStyle или HeaderStyle в DataGridColumnVisibility и Width, хотя это ISN» t совершенно одинаково.

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

Вы можете посмотреть на примере его here

<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}}"/> 
Смежные вопросы