我需要将Visibility
的{{1}}绑定到DataGridTemplateColumn
之外的属性,因为我需要将所有行中的此列绑定到DataGrid.ItemsSource
内的一个属性{1}},但据我所知,您可以将其绑定到ViewModel
内的内容,或者您应该使用ItemsSource
和ElementStyle
我已经尝试过这段代码:
EditingElementStyle
我确定我的绑定是正确的,因为它在我绑定 <DataGridTemplateColumn Header="post"
Visibility="{Binding DataContext.ProjectPostVisibility
, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
时工作正常如下:
DataGridCell.Visibility
答案 0 :(得分:22)
您的绑定是正确的,但它不能直接与DataGridTemplateColumn
一起使用,因为它不在可视树中。所以它不会导致DataContext
。
您需要从代码中绑定DataGridTemplateColumn
。 Here 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>