2012-08-27 108 views
3

我有一個數據網格,其ItemsSource綁定到CollectionViewSource
在每一列中,我指定綁定的Path屬性以獲取要顯示的特定信息。在WPF中綁定DataGridTextColumn可見性屬性

如果用戶想要更多信息,我想要做的是用複選框切換一些列。爲此,我需要將可見性屬性綁定到複選框的值(使用轉換器),但我很確定該列的數據上下文干擾綁定。

<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> 

我需要的複選框,在我的視圖模型爲好,所以我有它的IsChecked屬性綁定到屬性上我的ViewModel

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

關於我可以在datagrid中解決這個問題的任何建議?
如果我遺漏了任何可能有用的代碼,請讓我知道。

+0

@Rachel 雷切爾,謝謝您的回答!這是我遇到的確切問題。我感覺更接近,但綁定仍然無法正常工作。我根據鏈接的文章設置了「BindingProxy」類。我的用戶控件的'DataContext'設置爲我的ViewModel類,我的DataGrid從它繼承它的datacontext。我已經嘗試把「代理」資源放在我的數據網格和我的用戶控件中,並嘗試綁定到'Path = DataContext.ManagerFullHist'和'ElementName = IncludeFullHist'的IsChecked'屬性,並且這些都不起作用。我的控件的datacontext是否搞亂了事情? – KyleMit

+0

@Rachel,再次感謝您的回答。我得到了它的工作。這個問題對我來說太愚蠢了,因爲我試圖通過給它一個x:Key屬性(''')來在其他解決方法之一中查看DataContext,以某種方式干擾數據上下文。無論哪種方式,解決方案的工作原理如下。 謝謝! – KyleMit

+0

很高興你的工作:) – Rachel

回答

9

DataGridColumn不是VisualTree實際上一部分,所以在類綁定不能找到它們的源

您可以設置的東西像CellStyleDataGridColumnHeaderStyleVisibilityWidth財產,雖然這ISN」 t完全一樣。

我發現一個解決辦法是建立在你的<DataGrid.Resources>一個Freezable對象存儲綁定,然後使用StaticResourceVisibility結合最接近的一次。這不是一個漂亮的解決方案,但這是我目前唯一能找到的解決方案。

您可以查看一個例子吧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}}"/>