【发布时间】:2014-05-13 02:42:42
【问题描述】:
假设我有两个复选框,即 chkBox1 和 chkBox2。
现在我有一个名为 txtBlock 的文本块,它的可见性取决于 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 中的此绑定将不起作用,因为 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));
}
然后声明一个静态资源如下:
<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>
但是还是绑定不成功。
谁能推荐一个好的解决方案?
【问题讨论】:
-
感谢代理技巧
-
@WpfNewbie 不客气 :)