2011-10-10 84 views
45

的.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

回答

95

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