programing

WPF의 DataGrid Column 바인딩 가시성

javamemo 2023. 5. 5. 08:31
반응형

WPF의 DataGrid Column 바인딩 가시성

WPF에서 열을 숨기는 방법DataGrid제본을 통해?

제가 한 일은 이렇습니다.

<DataGridTextColumn Header="Column header"
                    Binding="{Binding ColumnValue}"
                    Width="100"
                    ElementStyle="{StaticResource DataGridRightAlign}"
                    Visibility="{Binding MyColumnVisibility}" />

그리고 이것이 제가 얻은 것입니다(아직 보이는 열 외에도).

시스템. 윈도우.데이터 오류: 2: 대상 요소에 대한 지배 FrameworkElement 또는 FrameworkContentElement를 찾을 수 없습니다.바인딩 식:경로=MyColumnVisibility; DataItem=filename; 대상 요소는 'DataGridTextColumn'(HashCode=1460142)이고 대상 속성은 'Visibility'(유형 'Visibility')입니다.

바인딩을 어떻게 고정합니까?

먼저 (또는 지원되는 다른 dataGrid 열)은 Visual 트리에 있지 않습니다.따라서 기본적으로 의 를 상속하지 않습니다.하지만, 그것은 효과가 있습니다.BindingDP 전용이며 DataGrid Column에 다른 DP는 없습니다.

동일한 Visual Tree에 있지 않기 때문에 모든 시도가DataContext사용.RelativeSource잘 작동하지 않을 것입니다.DataGridTextColumn로 이동할 수 없습니다.DataGrid.

이를 달성하기 위한 두 가지 다른 방법이 있습니다.


번째 사용Freezableclass. 객체는 시각적 또는 논리적 트리에 없는 경우에도 DataContext를 상속할 수 있습니다. 이를 활용할 수 있습니다.

먼저 다음을 상속하는 클래스를 만듭니다.Freezable그리고.DataXAML에서 바인딩하는 데 사용할 수 있는 DP:

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object),
                                     typeof(BindingProxy));
}

이제 DataGrid 리소스에 인스턴스를 추가하여 DataGrid의 DataContext를 상속하고 DataDP와 바인딩할 수 있습니다.

    <DataGrid>
        <DataGrid.Resources>
            <local:BindingProxy x:Key="proxy" Data="{Binding}"/>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Visibility="{Binding Data.MyColumnVisibility,
                                                Source={StaticResource proxy}}"/>
        </DataGrid.Columns>
    </DataGrid>

둘째, 다음을 사용하여 XAML의 UI 요소를 참조할 수 있습니다.ElementName또는x:Reference.하지만,ElementName는 동일한 시각적 트리에서만 작동하는 반면 x:Reference에는 이러한 제약 조건이 없습니다.

그래서 우리는 그것을 우리에게 유리하게 사용할 수 있습니다.더미 만들기FrameworkElement가시성이 다음으로 설정된 XAMLcollapsedFrameworkElement는 부모 컨테이너(창 또는 사용자 컨트롤)에서 DataContext를 상속합니다.

DataGrid에서 이 기능을 사용할 수 있습니다.

    <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Test"
                                Binding="{Binding Name}"
                                Visibility="{Binding DataContext.IsEnable,
                                          Source={x:Reference dummyElement}}"/>
        </DataGrid.Columns>
    </DataGrid>
<Window.Resources>
    <ResourceDictionary>
        <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" />
    </ResourceDictionary>
</Window.Resources>

<!-- Necessary for binding to resolve: adds reference to ProxyElement to tree.-->
<ContentControl Content="{StaticResource ProxyElement}" Visibility="Collapsed" />
<mch:MCHDataGrid Height="350"
                  AutoGenerateColumns="False"
                  FlowDirection="LeftToRight"
                  ItemsSource="{Binding PayStructures}"
                  SelectedItem="{Binding SelectedItem}">
    <DataGrid.Columns>
         <DataGridTemplateColumn Width="70"
                                 Header="name"
                                 IsReadOnly="True"
                                 Visibility="{Binding DataContext.IsShowName,
                                 Source={StaticResource ProxyElement}}">
             <DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                     <TextBlock Text="{Binding FieldName}" />
                 </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>                   
     </DataGrid.Columns>
</mch:MCHDataGrid>

뷰 모델에서 바인딩된 특성의 샘플:

private Visibility _isShowName;

public Visibility IsShowName
{
    get { return _isShowName; }
    set
    {
        _isShowName = value;
        OnPropertyChanged();
    }
}

제가 좋아하는 또 다른 쉬운 해결책은 접힌 더미를 추가하는 것입니다.FrameworkElement와 같은 수준으로DataGrid.그FrameworkElement그러면 다음으로 사용할 수 있습니다.SourceBinding와 함께x:Reference마크업 확장

예를 들어 다음과 같습니다.

<FrameworkElement x:Name="FrameWorkElementProxy" Visibility="Collapsed"/>
<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="post" 
            Visibility="{Binding DataContext.DataGridColumnVisibility, Source={x:Reference Name=FrameWorkElementProxy}}"/>
    </DataGrid.Columns>
</DataGrid>

다음과 같이 XAML에 Window/Page/UserControl DataContext 개체를 만든 경우 다른 빠른 옵션이 있습니다.

<Window.DataContext>  
    <local:ViewModel x:Name="MyDataContext"/>  
</Window.DataContext>

즉, 바인딩 소스에서 DataContext 개체의 x:Name을 사용하여 x:Reference를 추가할 수 있습니다.

<DataGridTextColumn Header="Column header"
                    Binding="{Binding ColumnValue}"
                    Width="100"
                    ElementStyle="{StaticResource DataGridRightAlign}"
                    Visibility="{Binding MyColumnVisibility, Source={x:Reference Name=MyDataContext}}"

이렇게 하면 바인딩 데이터 컨텍스트를 사용하지 않을 수 있습니다. 열 가시성 및 내 열 가시성 바인딩 사용

언급URL : https://stackoverflow.com/questions/22073740/binding-visibility-for-datagridcolumn-in-wpf

반응형