【问题标题】:WPF DataGridTemplateColumn set Visibility with binding Not firingWPF DataGridTemplateColumn 设置可见性与绑定未触发
【发布时间】:2015-11-10 17:11:49
【问题描述】:

我正在尝试设置和绑定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 Name="AdvancedToggleButton" Content="Advanced" />

【问题讨论】:

  • 如果错误不是您在静态资源中使用 BooleanToVisibiltyConverter 而不是 BooleanToVisaulConverter,请分享 advancedToggleButton 的声明
  • @Breeze 修复了 BooleanToVisaulConverter,见上文
  • 框架中已经有一个 BooleanToVisibilityConverter,仅供参考。您应该使用像 Snooper 这样的工具来检查可视化树在运行时是否存在绑定错误。
  • 为您找到了一种解决方法,非常奇怪的是,所有这些都指出您不能以“非野蛮”的方式显示隐藏列......或者我可能没有找到。一分钟后将返回一些代码。

标签: c# wpf mvvm ivalueconverter


【解决方案1】:

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

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

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

这适用于将可见性绑定到视图模型中的属性。在您的情况下,我会将状态也绑定到视图模型中的属性。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2016-01-13
      • 2011-10-23
      • 2012-10-13
      相关资源
      最近更新 更多