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

Posted

技术标签:

【中文标题】如何将 DataGridTemplateColumn.Visibility 绑定到 DataGrid.ItemsSource 之外的属性?【英文标题】:How to bind DataGridTemplateColumn.Visibility to a property outside of DataGrid.ItemsSource? 【发布时间】:2013-02-24 23:16:30 【问题描述】:

我需要将DataGridTemplateColumnVisibility 绑定到DataGrid.ItemsSource 之外的属性,因为我需要将所有行中的这一列绑定到ViewModel 内的一个属性,但到目前为止据我所知,您可以将其绑定到 ItemsSource 中的某些内容,或者您​​应该使用 ElementStyleEditingElementStyle 我已经尝试过这段代码:

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

【问题讨论】:

你能显示一些代码吗? @AbZy:我在上面添加了一些代码。 【参考方案1】:

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

您需要从后面的代码中绑定DataGridTemplateColumn。 Here is a demo 展示了一种实现方式。

【讨论】:

AbZy:非常感谢。我不知道,真的很有趣!【参考方案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>

【讨论】:

但也需要有这个(用于标题文本以反映可见绑定):&lt;DataGridTemplateColumn.HeaderStyle&gt; &lt;Style TargetType="DataGridColumnHeader"&gt; &lt;Setter Property="Visibility" Value="Binding Path=DataContext.isVisible, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=DataGrid" /&gt; &lt;/Style&gt; &lt;/DataGridTemplateColumn.HeaderStyle&gt; 谢谢。 @psulek 的回复和评论都有帮助。 虽然这个解决方案看起来很棒,但请注意它不会隐藏列 ifsef,而只是隐藏它的内容。【参考方案3】:

正如其他答案中提到的,该列不是视觉/逻辑树的一部分,也不是从FrameworkElement 继承的,这意味着它没有DataContext。这就是您的绑定不起作用的原因。

但是,您可以在 DataContext 是您要查找的级别添加一个虚拟(折叠)FrameworkElement(因此以您的示例为例,它将在 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>

【讨论】:

以上是关于如何将 DataGridTemplateColumn.Visibility 绑定到 DataGrid.ItemsSource 之外的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式