2014-04-02 155 views
2

假设我有两个复选框,即chkBox1和chkBox2。如何将DataGridTemplateColumn的可见性绑定到textBlock的可见性

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

现在我有一个DataGrid说2列。即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> 

但作为DataGrid列不可视树的一部分,这在DataGridTemplateColumn绑定将无法工作。所以,我创建了一个名为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> 

但是绑定仍然不成功。

任何人都可以提出一个很好的解决方案吗?的BindingProxy

+0

感谢您的代理把戏 – WpfNewbie

+0

@WpfNewbie不客气:) – Vishal

回答

2

Data依赖属性保存文本块可见性,所以你需要用它绑定。

变化

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

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

,你的知名度栏将正常工作。

+1

哦,你抓到了!!!!!愚蠢的我,我忘记了约束力的基本必要性。路径。再次感谢您尝试解决我的问题。 – Vishal

相关问题