programing

데이터그램 열 가시성 MVVM 바인딩

lastcode 2023. 4. 17. 21:54
반응형

데이터그램 열 가시성 MVVM 바인딩

.Net 3.5

컬럼이 데이터콘텍스트를 상속하지 않는다는 것을 알고 있으며, 다른 투고를 읽음으로써 이것이 효과가 있을 것이라고 생각했습니다.

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

하지만 물론 그렇지 않습니다.출력창은 불평하지 않습니다.찾은 리소스는 뷰모델 속성보다 새로운 것 같습니다.

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는 시각적인 트리의 일부가 아니기 때문에 데이터 컨텍스트에 접속되어 있지 않습니다.DataGrid.

서로 연결하려면 프록시 요소 접근 방식을 사용합니다.

  1. 프록시 추가FrameworkElement조상 패널의Resources.

  2. 보이지 않는 상태로 호스트합니다.ContentControl그것에 얽매이다Content.

  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로.PopupContextMenus(즉, 시각적 트리에 연결되지 않은 요소)

Silverlight 사용자

안타깝게도 프레임워크 요소를 사용하여 콘텐츠 제어 내용을 설정할 수 없습니다.회피책은 다음과 같습니다(이것은 Silverlight의 가이던스 코드일 뿐입니다).

  1. 프레임워크 요소 리소스를 다음과 같은 경량 리소스로 변경합니다.Textblock(Silverlight 에서는, 다음의 스태틱 자원을 지정할 수 없습니다.FrameworkElement를 입력합니다).

     <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);
            }
      }
    

따라서 텍스트 블록이 비주얼 트리에 연결되지 않을 수 있지만 데이터 컨텍스트 변경에 유의할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7711275/bind-datagrid-column-visibility-mvvm

반응형