绑定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
的数据上下文。
对于他们连接在一起使用这种代理元素的方法…
- 在您的祖先面板的
Resources
添加代理FrameworkElement
。 - 将其托pipe到与其
Content
绑定的不可见ContentControl
。 -
在您的可见性绑定中,使用此
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
连接到Popup
和ContextMenu
(即没有连接到可视化树上的任何元素)。
Silverlight用户
Silverlight中不允许使用任何框架元素来设置内容控件的内容。 所以解决方法是(这只是silverlight的指导代码)…
-
将框架元素资源更改为像
Textblock
那样轻量级的东西。 (Silverlight不允许指定FrameworkElement
types的静态资源。)<StackPanel.Resources> <TextBlock x:Key="MyTextBlock" />
-
写一个附加的属性来保持文本块的内容控制。
<ContentControl Visibility="Collapsed" local:MyAttachedBehavior.ProxyElement="{StaticResource MyTextBlock}" />
-
在附加的依赖项属性已更改的事件处理程序中,将内容控件的数据上下文绑定到文本块。
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可能不会连接到可视化树,但可能会意识到数据上下文的变化。
希望这可以帮助。