如何将DataGridTemplateColumn.Visibility绑定到DataGrid.ItemsSource之外的属性?

Gyp*_*psy 14 data-binding wpf binding wpfdatagrid

我需要将Visibilitya DataGridTemplateColumn的一个属性绑定到一个外面的属性DataGrid.ItemsSource,因为我需要将所有行中的这个列绑定到其中的一个属性ViewModel,但据我所知你只是可以将它绑定到内部的某个属性,ItemsSource或者你应该使用ElementStyle,EditingElementStyle 我已经尝试过这段代码:

 <DataGridTemplateColumn Header="post" 
                      Visibility="{Binding DataContext.ProjectPostVisibility
                    , RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
Run Code Online (Sandbox Code Playgroud)

我确定我的绑定是正确的,因为当我绑定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 >
Run Code Online (Sandbox Code Playgroud)

Abd*_*Haj 22

您的绑定是正确的,但它不能DataGridTemplateColumn直接使用,因为它不在可视树中.所以它不是一个人DataContext.

你需要绑定DataGridTemplateColumn后面的代码.这是一个演示,展示了一种方法.


nal*_*lka 9

正如其他答案中提到的,该列不是视觉/逻辑树的一部分,并且不会继承FrameworkElement它没有的含义DataContext。这就是你的绑定不起作用的原因。

但是,您可以FrameworkElement在您要查找的级别添加一个虚拟(折叠) DataContext(因此以您的示例为例,它位于 DataGrid 的级别),折叠它并将其用作绑定的源x:Reference标记扩展。

这是一个例子:

<FrameworkElement x:Name="Proxy" Visibility="Collapsed"/>
<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="post" 
            Visibility="{Binding DataContext.ProjectPostVisibility, Source={x:Reference Name=Proxy}}"/>
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)


Bia*_*man 5

在 DataGridTemplateColumn.CellStyle 中添加此设置器并完成:

   <Setter Property="Visibility" Value="{Binding DataContext.isVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
Run Code Online (Sandbox Code Playgroud)

如果您需要更多帮助,请查看下面我的示例。我希望“删除”按钮在项目级别不可见。首先,您必须确保视图模型中有 isVisible 属性:

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

然后:

  if (isProj == false)
            this.model.isVisible = Visibility.Visible;
        else
            this.model.isVisible = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)