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

我看过几乎每一个单一的解决这个问题,并没有什么作品..

+0

如果发现你的问题有点不清楚。你只是试图根据绑定的ViewModel属性使数据列可见或不可见? – ChrisBD

+0

您可以在''中更改ContextMenu - 难怪您的窗口DataContext无法访问。 –

+0

@ ChrisBD:是的,这是主意。 VM prop是通过datacontext设置的。 – jrb

DataGridColumn s为不可视树的一部分,因此它们没有连接到DataGrid的数据上下文。

对他们来说连接在一起,这样使用代理服务器组件的方法...

  1. 在你的祖先面板的Resources添加一个代理FrameworkElement
  2. 将其托管到与其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

除此之外,上述方法也适用极大连接DataContextPopup S和ContextMenu S(即未连接到可视化树中的任何元素)。

Silverlight的用户

可悲设置与任何框架元件的内容控件内容没有在Silverlight不允许的。因此,解决方法是(这仅仅是Silverlight的一个引导代码)...

  1. 变化框架要素资源的东西轻量级喜欢Textblock。 (Silverlight不允许指定FrameworkElement类型的静态资源。)

    <StackPanel.Resources> 
        <TextBlock x:Key="MyTextBlock" /> 
    
  2. 收件附加属性来贴靠所述内容控制文本块。

    <ContentControl Visibility="Collapsed" 
           local:MyAttachedBehavior.ProxyElement="{StaticResource MyTextBlock}" /> 
    
  3. 在所附的依赖属性改变后的事件处理程序,设置绑定内容控制到文本块的的数据上下文。

所以这样的文本块可能无法连接到可视树,但会可能知道的数据环境的变化。

希望这会有所帮助。

+0

取消选择和重新选择时有一个豁免:指定的元素已经是另一个元素的逻辑子元素。先断开它。你知道为什么吗? – jrb

+0

可能是你的'ContextMenu' ...它只能连接到一个父母。 –

+0

将ContextMenu更改为DataGrid CM而不是DGColumnHeader CM,但它没有帮助。我在多列使用这个如果重要.. – jrb