Подтвердить что ты не робот

Как привязать DataGridTemplateColumn.Visibility к свойству за пределами DataGrid.ItemsSource?

Мне нужно привязать Visibility к DataGridTemplateColumn к свойству вне DataGrid.ItemsSource, потому что мне нужно связать этот столбец во всех строках с одним свойством внутри ViewModel, но в качестве как я знаю, вы просто можете связать это с чем-то внутри ItemsSource, или вы должны использовать ElementStyle и EditingElementStyle Я уже пробовал этот код:

 <DataGridTemplateColumn Header="post" 
                      Visibility="{Binding DataContext.ProjectPostVisibility
                    , RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>

И я уверен, что моя привязка правильная, потому что она отлично работает, когда я привязываю DataGridCell.Visibility, как показано ниже:

<DataGridTemplateColumn Header="post">
    <DataGridTemplateColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="Visibility" Value="{Binding DataContext.ProjectPostVisibility,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
                        </Style>
                    </DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn >
4b9b3361

Ответ 1

Ваша привязка верна, но она не будет работать с DataGridTemplateColumn напрямую, потому что она не в визуальном дереве. Поэтому он не наследует DataContext.

Вам нужно привязать DataGridTemplateColumn от кода. Вот демонстрация, которая показывает способ сделать это.

Ответ 2

Добавьте этот сеттер в DataGridTemplateColumn.CellStyle и выполните:

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

Если вам нужна дополнительная помощь, посмотрите мой пример ниже. Я хочу, чтобы кнопка "Удалить" не отображалась на уровне проекта. Сначала вы должны убедиться, что у вас есть свойство isVisible в вашей модели просмотра:

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

Тогда:

  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>