WPF DataGridTemplateColumn使用绑定设置可见性不触发

时间:2015-11-10 17:11:49

标签: c# wpf mvvm ivalueconverter

我正在尝试使用ToggleButton设置和绑定,以更改DataGrid中列的可见性。 I am following this post问题在于转换器永远不会触发,我也不知道为什么。

我的代码如下:

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

编辑:@Breeze发现booleanToVisaulConverter实际上没有指向BooleanToVisaulConverter的错误。这已经修复但仍未解雇。要求提供ToggleButton代码;

<ToggleButton Name="AdvancedToggleButton" Content="Advanced" />

2 个答案:

答案 0 :(得分:3)

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

首先,您必须实现一个包含datacontext的binding-proxy-class。这个类看起来像:

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

然后定义Page-Resources,您可以创建此绑定代理的实例,如:

<namespaceOfProxy:BindingProxy Data="{Binding}" x:Key="proxy"/>

然后,您可以使用以下代码将Visiblity的{​​{1}}绑定到viewmodel中的属性:

DataGridTemplateColumn

这适用于将可见性绑定到viewmodel中的属性。在你的情况下,我会将the的状态绑定到viewmodel中的属性。

答案 1 :(得分:0)

事实证明,如果你将Visibility设置为标题和列的单元格,它仍然存在并且没有完全隐藏......经过一些挖掘(之前从未使用过数据网格:))I&#39 ; ve发现您可以访问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;
}

当然,如果您要在实际代码中使用固定索引,您必须实现一些逻辑来获取相应的列。