вы можете настроить видимость напрямую в столбце данных или текстовом столбце. Дело в том, что эти столбцы не лежат в визуальном дереве сетки данных, что означает, что он не наследует текст данных своего родителя. Если вы хотите убедиться, что привязка работает, вы должны создать какой-то прокси, который будет наследовать текст данных от родительского элемента управления, например:
<FrameworkElement x:Name="Proxy" Visibility="Collapsed" />
в любом месте элемента управления, который, как вы уверены, имеет правильный текстовый текст. Этот элемент унаследует его наверняка. Итак ... приступаем прямо к делу. Я сделал небольшой пример для вас, чтобы изменить видимость в привязках вашей колонки:
<Grid>
<FrameworkElement x:Name="Proxy" Visibility="Collapsed" />
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Customers}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Name" Binding="{Binding Surname}" />
<DataGridTextColumn Header="Name" Binding="{Binding Age}" />
<DataGridTemplateColumn Visibility="{Binding DataContext.IsShown, Converter={StaticResource BoolToVisibilityConverter}, Source={x:Reference Proxy}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Test" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
</Style>
</DataGrid.ItemContainerStyle>
</DataGrid>
</Grid>
Свойство IsShown явно находится на стороне модели представления. Если вы не удовлетворены таким решением, попробуйте добавить другой прокси-клиент следующим образом:
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.Resources>
<utils:BindingProxy x:Key="BindingProxy" Data="{Binding}" />
</DataGrid.Resources>
...
с использованием класса Freezable - объекты Freezable могут наследовать DataContext, даже если они не находятся в визуальном или логическом дереве. Таким образом, мы можем воспользоваться этим для нашего использования.