绑定DataGrid列知名度MVVM
问题描述:
的.Net 3.5绑定DataGrid列知名度MVVM
我知道,列不继承的datacontext和阅读其他职位我以为这会工作:
Visibility="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(FrameworkElement.DataContext).IsColumnNameVisible,
Converter={StaticResource boolToVisConverter}}"
的但是当然它doesn” t .. 输出窗口不抱怨,似乎我找到的资源,但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>
我看过几乎每一个单一的解决这个问题,并没有什么作品..
答
DataGridColumn
s为不可视树的一部分,因此它们没有连接到DataGrid
的数据上下文。
对他们来说连接在一起,这样使用代理服务器组件的方法...
- 在你的祖先面板的
Resources
添加一个代理FrameworkElement
。 - 将其托管到与其
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
S和ContextMenu
S(即未连接到可视化树中的任何元素)。
Silverlight的用户
可悲设置与任何框架元件的内容控件内容没有在Silverlight不允许的。因此,解决方法是(这仅仅是Silverlight的一个引导代码)...
-
变化框架要素资源的东西轻量级喜欢
Textblock
。 (Silverlight不允许指定FrameworkElement
类型的静态资源。)<StackPanel.Resources> <TextBlock x:Key="MyTextBlock" />
-
收件附加属性来贴靠所述内容控制文本块。
<ContentControl Visibility="Collapsed" local:MyAttachedBehavior.ProxyElement="{StaticResource MyTextBlock}" />
-
在所附的依赖属性改变后的事件处理程序,设置绑定内容控制到文本块的的数据上下文。
所以这样的文本块可能无法连接到可视树,但会可能知道的数据环境的变化。
希望这会有所帮助。
如果发现你的问题有点不清楚。你只是试图根据绑定的ViewModel属性使数据列可见或不可见? – ChrisBD
您可以在''中更改ContextMenu - 难怪您的窗口DataContext无法访问。 –
@ ChrisBD:是的,这是主意。 VM prop是通过datacontext设置的。 – jrb