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 트리에 있지 않습니다.따라서 기본적으로 의 를 상속하지 않습니다.하지만, 그것은 효과가 있습니다.Binding
DP 전용이며 DataGrid Column에 다른 DP는 없습니다.
동일한 Visual Tree에 있지 않기 때문에 모든 시도가DataContext
사용.RelativeSource
잘 작동하지 않을 것입니다.DataGridTextColumn
로 이동할 수 없습니다.DataGrid
.
이를 달성하기 위한 두 가지 다른 방법이 있습니다.
첫 번째 사용Freezable
class. 객체는 시각적 또는 논리적 트리에 없는 경우에도 DataContext를 상속할 수 있습니다. 이를 활용할 수 있습니다.
먼저 다음을 상속하는 클래스를 만듭니다.Freezable
그리고.Data
XAML에서 바인딩하는 데 사용할 수 있는 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
가시성이 다음으로 설정된 XAMLcollapsed
FrameworkElement는 부모 컨테이너(창 또는 사용자 컨트롤)에서 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
그러면 다음으로 사용할 수 있습니다.Source
의Binding
와 함께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
'programing' 카테고리의 다른 글
asp.net 외부에서 레이저 뷰 엔진을 사용할 수 있습니까? (0) | 2023.05.05 |
---|---|
잡기 및 다시 던지기에 대한 모범 사례.NET 예외 (0) | 2023.05.05 |
mongodb 구성 파일에서 권한을 설정하는 방법은 무엇입니까? (0) | 2023.05.05 |
Git 푸시 오류:이전 링크를 해제할 수 없음(권한 거부) (0) | 2023.05.05 |
골랑은 파이썬처럼 문자열을 곱할 수 있습니까? (0) | 2023.05.05 |