5

我有一个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>

我的视图模型中也需要该复选框,因此我将其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}}"/>

关于我可以在数据网格中解决这个问题的方法有什么建议吗?
如果我省略了任何可能有用的代码,请告诉我。

4

1 回答 1

11

DataGridColumn实际上不是 的一部分VisualTree,因此类上的绑定无法找到它们的源

您可以在或中设置VisibilityandWidth属性,尽管这并不完全相同。CellStyleHeaderStyleDataGridColumn

我找到的最接近解决方案的方法是在您的存储绑定中创建一个Freezable对象,然后在绑定中使用它。这不是一个很好的解决方案,但这是我目前唯一能找到的解决方案。<DataGrid.Resources>StaticResourceVisibility

您可以在此处查看它的示例

<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}}"/>  
于 2012-08-27T16:38:03.647 回答