How to bind DataGridTemplateColumn.Visibility to a property outside of DataGrid.ItemsSource? How to bind DataGridTemplateColumn.Visibility to a property outside of DataGrid.ItemsSource? wpf wpf

How to bind DataGridTemplateColumn.Visibility to a property outside of DataGrid.ItemsSource?


Your binding is correct, but it won't work with DataGridTemplateColumn directly because it's not in the visual tree. So it's not inherting DataContext.

You need to bind the DataGridTemplateColumn from code behind. Here is a demo that shows a way of doing it.


Add this setter in the DataGridTemplateColumn.CellStyle and done:

   <Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>

If you need more help look at my example below. I want the Remove button to not be visible at the project level. First you have to make sure you have a isVisible property in your view model:

  private System.Windows.Visibility _isVisible;    public System.Windows.Visibility isVisible    {        get { return _isVisible; }        set        {            if (_isVisible != value)            {                _isVisible = value;                OnPropertyChanged("isVisible");            }        }    }

Then:

  if (isProj == false)            this.model.isVisible = Visibility.Visible;        else            this.model.isVisible = Visibility.Collapsed;

XAML:

<DataGridTemplateColumn  >       <DataGridTemplateColumn.CellTemplate >            <DataTemplate >               <Button x:Name="btnRemove" Content="X">                 <Button.Style>                    <Style TargetType="{x:Type Button}">                         <Setter Property="FontWeight" Value="ExtraBold" />                         <Setter Property="FontSize" Value="50" />                     </Style>                 </Button.Style>            </Button>         </DataTemplate>   </DataGridTemplateColumn.CellTemplate>   <DataGridTemplateColumn.CellStyle>        <Style TargetType="{x:Type DataGridCell}">               <Setter Property="Background"  Value="Red"/>               <Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>        </Style>   </DataGridTemplateColumn.CellStyle>


As mentionned in other answers, the column isn't part of the visual/logical tree and doesn't inherit from FrameworkElement meaning it has no DataContext. That's why your binding doesn't work.

However you can add a dummy (collapsed) FrameworkElement at a level where the DataContext is what you're looking for (so taking your example, it'd be at the DataGrid's level), collapse it and use it as the Source of your Binding with the x:Reference markup extension.

Here's an example :

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