c# - 如何将 DataGridTemplateColumn 的 Visibility 绑定(bind)到 textBlock 的 Visibility

标签 c# wpf xaml mvvm datagrid

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

现在我有一个名为 txtBlock 的文本 block ,其可见性取决于 chkBox1 和 chkBox2 的 IsChecked 属性。即如果 chkBox1.IsChecked = true 且 chkBox2.IsChecked = true 则只有 txtBlock 应该可见。

现在我有一个包含 2 列的 DataGrid。即 colID 和 colName。两个列都是 DataGridTemplateColumns。我想让 colName 仅在 txtBlock.Visibility = Visible 时可见。

这是 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 中的此绑定(bind)将不起作用,因为 DataGrid 列不是可视化树的一部分。因此,我创建了一个名为 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));
}

然后声明一个 StaticResource 如下:

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

然后我尝试按如下方式绑定(bind) DataGridTemplateColumn :

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

但是还是没有绑定(bind)成功。

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

最佳答案

Data BindingProxy 的依赖属性持有 textBlock Visibility,因此您需要与其绑定(bind)。

改变

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

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

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

关于c# - 如何将 DataGridTemplateColumn 的 Visibility 绑定(bind)到 textBlock 的 Visibility,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800893/

相关文章:

C# - 检索 COM+ 组件的属性?

c# - 在 CustomValidation 中返回一个复杂对象而不是 ValidationResult

c# - WPF - 在 UserControl 中绑定(bind) ObservableCollection 依赖属性

wpf - 指定具有文本和绑定(bind)路径混合的按钮内容

c# - 为什么我需要 'dummy' 行代码才能加载PresentationFramework?

c# - 在 C# 中显示从 1 到 100 的数字,使得每行以模数 10 结尾

wpf - 如何让菜单在 WPF 中向左打开?

WPF MVVM 在 View 模型中使用代码 C# 为 TreeView 添加动态上下文菜单

c# - MultiBinding - 指定的转换无效

c# - 在 WPF 中将 Canvas 的派生类添加到 Window 时出现问题