xaml - WPF에서 DataGridColumn에 대한 가시성 바인딩




visibility (3)

 <Window.Resources>
        <ResourceDictionary>
            <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" />
        </ResourceDictionary>
 </Window.Resources>

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

바인딩을 통해 WPF DataGrid 의 열을 숨기려면 어떻게합니까?

이것이 내가 한 일이다.

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

그리고 이것은 내가 가지고있는 것입니다 (열이 보이지 않는 것 외에) :

System.Windows.Data 오류 : 2 : 대상 요소에 대해 FrameworkElement 또는 FrameworkContentElement를 찾을 수 없습니다. BindingExpression : Path = MyColumnVisibility; DataItem = null; 대상 요소는 'DataGridTextColumn'(HashCode = 1460142)입니다. 대상 속성이 '가시성'(유형 '가시성')입니다.

통치가 무엇을 의미하는지 모릅니다. 창문에 어딘가에 대통령이있어 어떤 것이 효과가 있고 그렇지 않은 것은 무엇인지 결정합니다. 아니면 무언가에 투표해야합니까?

웹에서 솔루션을 검색하는 동안 유망한 제목이 있지만 완전히 관련이 없거나 재생할 수없는 내용의 12 페이지와 같은 것을 발견했습니다. 그래서 이것이 문제에 관한 첫 번째 질문 인 것 같습니다. 어떤 생각?


우선 DataGridTextColumn 또는 지원되는 다른 모든 DataGridTextColumn 열은 DataGrid 시각적 트리에 있지 않습니다 . 따라서 기본적 으로 DataGrid DataContext 를 상속하지 않습니다 . 그러나 DataGridColumn의 다른 DP가 아닌 Binding DP에서만 작동합니다.

DataGrid는 DataGrid를 트래버스 할 수 없으므로 RelativeSource 를 사용하여 DataContext를 가져 오려고해도 VisualTree에 속하지 않기 때문에 작동하지 않습니다.

두 가지 방법으로 달성 할 수 있습니다.

Freezable 클래스를 처음 사용 - Freezable 객체는 시각적 트리 또는 논리적 트리가 아닌 경우에도 DataContext를 상속 할 수 있습니다. 그래서, 우리는 그것을 우리의 사용에 활용할 수 있습니다.

먼저 XAML에서 바인딩 할 수있는 FreezableData 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 리소스에 추가하여 DataGrid의 DataContext를 상속 한 다음 Data DP와 바인딩 할 수 있습니다.

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

둘째 , ElementName 또는 x:Reference 사용하여 XAML의 모든 UI 요소를 참조 할 수 있습니다. 하지만 ElementName 은 같은 비주얼 트리에서만 작동하지만 x : Reference에는 그러한 제약 조건이 없습니다.

그래서 우리는 이점을 우리에게도 사용할 수 있습니다. Visibility가 축소되도록 설정된 XAML에서 더미 FrameworkElement 를 만듭니다. FrameworkElement는 Window 또는 UserControl이 될 수있는 부모 컨테이너로부터 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>

그것을 발견.

패스를 지정하는 더 좋은 방법은 Pack URIs 입니다. XAML을 다음과 같이 변경했습니다.

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

그것을 고쳤다.





wpf xaml datagrid visibility