如何将 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 【问题描述】:我需要将DataGridTemplateColumn
的Visibility
绑定到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 >
【问题讨论】:
你能显示一些代码吗? @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>
【讨论】:
但也需要有这个(用于标题文本以反映可见绑定):<DataGridTemplateColumn.HeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="Visibility" Value="Binding Path=DataContext.isVisible, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=DataGrid" /> </Style> </DataGridTemplateColumn.HeaderStyle>
谢谢。 @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 之外的属性?的主要内容,如果未能解决你的问题,请参考以下文章