绑定datagrid列可见性MVVM

.Net 3.5

我知道列不会inheritancedatacontext,并通过阅读其他职位,我认为这将工作:

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" 

然而,当然它不..输出窗口不抱怨,似乎是我find的资源,但viewmodel属性是较新的调用。

这是整个DG:

 <tk:DataGrid VirtualizingStackPanel.IsVirtualizing="False" Grid.Column="0" AlternationCount="2" AreRowDetailsFrozen="True" AutoGenerateColumns="False" Background="Transparent" BorderThickness="0" CanUserAddRows="False" CanUserReorderColumns="True" CanUserResizeRows="False" GridLinesVisibility="None" ItemsSource="{Binding Employees}" SelectionMode="Single" ColumnHeaderStyle="{StaticResource columnHeaderStyle}" RowHeaderStyle="{StaticResource rowHeaderStyle}" CellStyle="{StaticResource cellStyle}" RowStyle="{StaticResource rowStyle}" ContextMenu="{StaticResource columnHeaderContextMenu}"> <tk:DataGrid.Resources> <ContextMenu x:Key="columnHeaderContextMenu" ItemsSource="{Binding ColumnHeaderContextMenuItems}" /> <Style TargetType="{x:Type ScrollBar}"> <Setter Property="Background" Value="Transparent"/> </Style> <Style TargetType="{x:Type tk:DataGridColumnHeader}"> <Setter Property="Background" Value="Transparent"/> </Style> </tk:DataGrid.Resources> <tk:DataGrid.Triggers> <EventTrigger RoutedEvent="tk:DataGridRow.MouseDoubleClick"> <EventTrigger.Actions> <BeginStoryboard Storyboard="{StaticResource showDetailGrid}"/> </EventTrigger.Actions> </EventTrigger> </tk:DataGrid.Triggers> <tk:DataGrid.Columns> <tk:DataGridTextColumn IsReadOnly="True" Header="test" Binding="{Binding Name, Mode=OneWay}" Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" /> </tk:DataGrid.Columns> </tk:DataGrid> 

我已经阅读了几乎每一个解决这个问题的解决scheme,没有任何工作..

DataGridColumn不是可视化树的一部分,所以它们没有连接到DataGrid的数据上下文。

对于他们连接在一起使用这种代理元素的方法…

  1. 在您的祖先面板的Resources添加代理FrameworkElement
  2. 将其托pipe到与其Content绑定的不可见ContentControl
  3. 在您的可见性绑定中,使用此ProxyElement作为StaticResource作为数据上下文源。

     <StackPanel> <StackPanel.Resources> <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/> </StackPanel.Resources> <ContentControl Visibility="Collapsed" Content="{StaticResource ProxyElement}"/> <DataGrid AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Visibility="{Binding DataContext.IsTextColumnVisibile, Source={StaticResource ProxyElement}, Converter={StaticResource BooleanToVisibilityConverter}}" Binding="{Binding Text}"/> </DataGrid.Columns> </DataGrid> </StackPanel> 

除了DataGridColumn之外,上面的方法也可以很好地将DataContext连接到PopupContextMenu (即没有连接到可视化树上的任何元素)。

Silverlight用户

Silverlight中不允许使用任何框架元素来设置内容控件的内容。 所以解决方法是(这只是silverlight的指导代码)…

  1. 将框架元素资源更改为像Textblock那样轻量级的东西。 (Silverlight不允许指定FrameworkElementtypes的静态资源。)

     <StackPanel.Resources> <TextBlock x:Key="MyTextBlock" /> 
  2. 写一个附加的属性来保持文本块的内容控制。

     <ContentControl Visibility="Collapsed" local:MyAttachedBehavior.ProxyElement="{StaticResource MyTextBlock}" /> 
  3. 在附加的依赖项属性已更改的事件处理程序中,将内容控件的数据上下文绑定到文本块。

      private static void OnProxyElementPropertyChanged( DependencyObject depObj, DependencyPropertyChangedEventArgs e) { if (depObj is ContentControl && e.NewValue is TextBlock) { var binding = new Binding("DataContext"); binding.Source = depObj; binding.Mode = OneWay; BindingOperations.SetBinding( (TextBlock)e.NewValue, TextBlock.DataContextProperty, binding); } } 

所以这样textblock可能不会连接到可视化树,但可能会意识到数据上下文的变化。

希望这可以帮助。