带有绑定的WPF DataGridTemplateColumn集Visibility未激发
本文关键字:Visibility DataGridTemplateColumn 绑定 WPF | 更新日期: 2023-09-27 18:21:28
我正在尝试设置并绑定ToggleButton
,以更改DataGrid
中列的可见性。我在关注这篇文章。问题是转换器永远不会着火,我不知道为什么。
我的代码如下:
<DataGridTemplateColumn Header="My Header"
Visibility="{Binding IsChecked,
ElementName=AdvancedToggleButton,
Converter={StaticResource booleanToVisaulConverter}}" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- Elements removed for brevity-->
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
转换器就是这个
<Page.Resources>
<local:BooleanToVisaulConverter x:Key="booleanToVisaulConverter" />
</Page.Resources>
背后有代码;
public class BooleanToVisaulConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool visibility = (bool)value;
return visibility ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Visibility visibility = (Visibility)value;
return (visibility == Visibility.Visible);
}
}
edit:@Breeze发现一个错误,booleanToVisaulConverter
实际上并没有指向BooleanToVisaulConverter
。这已经修复,但仍然没有开火。询问ToggleButton代码;
<ToggleButton Name="AdvancedToggleButton" Content="Advanced" />
几周前我也遇到过同样的问题。我的解决方案如下:
首先,您必须实现一个绑定代理类,该类保存您的数据上下文。这个类看起来像:
public class BindingProxy : Freezable
{
public static readonly DependencyProperty DataProperty = DependencyProperty.Register(
"Data", typeof (object), typeof (BindingProxy), new UIPropertyMetadata(null));
public object Data
{
get { return GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
}
然后定义页面资源,创建一个绑定代理的实例,如:
<namespaceOfProxy:BindingProxy Data="{Binding}" x:Key="proxy"/>
然后,您可以使用以下代码将DataGridTemplateColumn
的Visiblity
绑定到视图模型中的属性:
Visibility="{Binding Source={StaticResource proxy}, Path=Data.IsToggleButtonChecked, Converter={StaticResource booleanToVisaulConverter}}"
这适用于将可见性绑定到视图模型中的属性。在您的情况下,我会将的状态也绑定到视图模型中的属性。
因此,如果将Visibility设置为列的标题和单元格,它仍然存在,并且没有完全隐藏。。。经过一番挖掘(以前从未使用过数据网格:)),我发现您可以访问DataGrid对象中的列,因此最快的方法是:
XAML
<ToggleButton Name="AdvancedToggleButton"
Content="Advanced"
Click="AdvancedToggleButton_Click" />
背后的代码
private void AdvancedToggleButton_Click(object sender, RoutedEventArgs e)
{
var newVisibility = (bool)(sender as ToggleButton).IsChecked ?
Visibility.Visible : Visibility.Collapsed;
this.theDataGrid.Columns[0].Visibility = newVisibility;
}
当然,如果要在实际代码中使用固定索引,则必须实现一些逻辑才能获得适当的列,而不是使用固定索引。