带有绑定的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" />

带有绑定的WPF DataGridTemplateColumn集Visibility未激发

几周前我也遇到过同样的问题。我的解决方案如下:

首先,您必须实现一个绑定代理类,该类保存您的数据上下文。这个类看起来像:

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"/>

然后,您可以使用以下代码将DataGridTemplateColumnVisiblity绑定到视图模型中的属性:

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;
}

当然,如果要在实际代码中使用固定索引,则必须实现一些逻辑才能获得适当的列,而不是使用固定索引。

相关文章: