如何将 DataGridTemplateColumn 的可见性绑定到 textBlock 的可见性

本文关键字:可见性 textBlock 绑定 DataGridTemplateColumn | 更新日期: 2023-09-27 17:55:57

假设我有两个复选框,即chkBox1和chkBox2。

现在我有一个名为txtBlock的文本块,其可见性取决于chkBox1和chkBox2的IsChecked Property。 即如果 chkBox1.IsChecked = true 和 chkBox2.IsChecked = true 那么只有 txtBlock 应该是可见的。

现在我有一个数据网格,比如说 2 列。 即 colID 和 colName。这两个列都是 DataGridTemplateColumns。我想让 colName 仅当 txtBlock.Visibility = 可见时才可见。

这是 XAML:

<Window........>
    <CheckBox x:Name="chkBox1" />
    <CheckBox x:Name="chkBox2" />
    <TextBlock x:Name="txtBlock">
        <MultiBinding Converter="{StaticResource twiceBoolToVisibilityConverter}">
            <Binding ElementName="chkBox1" Path="IsChecked" />
            <Binding ElementName="chkBox2" Path="IsChecked" />
        </MultiBinding>
    </TextBlock>
    <DataGrid>
        <DataGridTemplateColumn Header="ID">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Name" Visibility="{Binding Path=Visibility, ElementName=txtBlock}">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid>
</Window>

但是 DataGridTemplateColumn 中的此绑定将不起作用,因为 DataGrid Column 不是可视化树的一部分。因此,我创建了一个名为 BindingProxy 的类,如下所示:

public class BindingProxy : Freezable
{
    #region Overrides of Freezable
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }
    #endregion
    public object Data
    {
        get { return GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

然后声明了一个静态资源,如下所示:

<DataGrid.Resources>
    <helpers:BindingProxy x:Key="proxy" Data="{Binding Visibility, ElementName=txtBlock}" />
</DataGrid.Resources>

然后我尝试绑定数据网格模板列,如下所示:

<DataGridTemplateColumn Header="Name" Visibility="{Binding Source={StaticResource proxy}}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

但绑定仍然不成功。

有人能提出一个好的解决方案吗?

如何将 DataGridTemplateColumn 的可见性绑定到 textBlock 的可见性

Data BindingProxy的依赖属性包含textBlock Visibility,因此您需要与它绑定。

改变

Visibility="{Binding Source={StaticResource proxy}}"

Visibility="{Binding Data, Source={StaticResource proxy}}"

并且您的列可见性将正常工作。