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

时间:2014-04-02 03:18:58

标签: c# wpf xaml mvvm datagrid

假设我有两个checkBox,即chkBox1和chkBox2。

现在我有一个名为txtBlock的textBlock,其可见性取决于chkBox1的isChecked属性以及chkBox2。即如果chkBox1.IsChecked = true且chkBox2.IsChecked = true那么只有txtBlock应该是可见的。

现在我用一个名为2列的DataGrid。即colID和colName。这两列都是DataGridTemplateColumns。我想只在txtBlock.Visibility = Visible时使colName可见。

这是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不是Visual Tree的一部分。所以,我按如下方式创建了一个Class Called 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>

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

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

但是绑定仍然没有成功。

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

1 个答案:

答案 0 :(得分:2)

Data BindingProxy 的依赖项属性包含textBlock可见性,因此您需要与其绑定。

更改

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

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

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