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

时间:2013-03-09 12:07:44

标签: wpf data-binding binding wpfdatagrid

我需要将Visibility的{​​{1}}绑定到DataGridTemplateColumn之外的属性,因为我需要将所有行中的此列绑定到DataGrid.ItemsSource内的一个属性{1}},但据我所知,您可以将其绑定到ViewModel内的内容,或者您​​应该使用ItemsSourceElementStyle 我已经尝试过这段代码:

EditingElementStyle

我确定我的绑定是正确的,因为它在我绑定 <DataGridTemplateColumn Header="post" Visibility="{Binding DataContext.ProjectPostVisibility , RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/> 时工作正常如下:

DataGridCell.Visibility

3 个答案:

答案 0 :(得分:22)

您的绑定是正确的,但它不能直接与DataGridTemplateColumn一起使用,因为它不在可视树中。所以它不会导致DataContext

您需要从代码中绑定DataGridTemplateColumnHere is a demo显示了一种方法。

答案 1 :(得分:2)

在DataGridTemplateColumn.CellStyle中添加此setter并完成:

   <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>

答案 2 :(得分:1)

如其他答案所述,该列不是视觉/逻辑树的一部分,也不是从 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>