์ฐธ์กฐ ์ฌ์ดํธ : WPF : 8. DataGridColumn์ Visibility ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ - LCโs ๊ฐ๋ฐ ๋ธ๋ก๊ทธ
์ฐ์ ์ฝ๋๋ฅผ ๋จผ์ ์ ์๋ฉด
<DataGrid CanUserAddRows="False" CanUserDeleteRows="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Column1" Header="Column1" />
<DataGridTextColumn Header="Column2" Visibility="{Binding Column2Visible, Converter={StaticResource BoolToVisibilityConverter}}" />
</DataGrid.Columns>
</DataGrid>
<CheckBox Content="Column Visible" IsChecked="{Binding Column2Visible, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="Test" Visibility="{Binding Column2Visible, Converter={StaticResource BoolToVisibilityConverter}}" />
ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด TextBlock๋ ์ ์์ ์ผ๋ก Visible์ด ๋ณ๊ฒฝ ๋๋๋ฐ Column์ ๋ณ๊ฒฝ ๋์ง ์์ต๋๋ค.
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element.
๊ฐ ๋ฐ์ ํฉ๋๋ค.
ํ์ธํด ๋ณด๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐ ํด ๋ณด๋ฉด
// xaml
<Button
Command="{Binding TestCommand}"
CommandParameter="{Binding ElementName=Column1}"
Content="Test" />
// cs
private void Test(DataGridTextColumn column)
{
try
{
VisualTreeHelper.GetParent(column);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
์ ๊ฐ์ exception์ ํ์ธ ํ ์ ์์ต๋๋ค.
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํด์ Freezable์ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋ฉ๋๋ค.
// xaml
<DataGrid CanUserAddRows="False" CanUserDeleteRows="False">
<DataGrid.Resources>
<local:VisibleBindingProxy x:Key="Culmn2VisiblePlory" Visible="{Binding Column2Visible, Converter={StaticResource BoolToVisibilityConverter}}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn x:Name="Column1" Header="Column1" />
<DataGridTextColumn Header="Column2" Visibility="{Binding Visible, Source={StaticResource Culmn2VisiblePlory}}" />
</DataGrid.Columns>
</DataGrid>
<CheckBox Content="Column Visible" IsChecked="{Binding Column2Visible, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="Test" Visibility="{Binding Column2Visible, Converter={StaticResource BoolToVisibilityConverter}}" />
// cs
public class VisibleBindingProxy : Freezable
{
public Visibility Visible
{
get { return (Visibility)GetValue(VisibleProperty); }
set { SetValue(VisibleProperty, value); }
}
public static readonly DependencyProperty VisibleProperty =
DependencyProperty.Register("Visible", typeof(Visibility), typeof(VisibleBindingProxy), new PropertyMetadata(Visibility.Visible));
protected override Freezable CreateInstanceCore()
{
return new VisibleBindingProxy();
}
}