0

我的数据网格中有以下 DataGridTextColumn:

<my:DataGridTextColumn Visibility="{Binding Path=DataContext.Filter, Converter={StaticResource ColumnVisibilityConverter}"> 

过滤器是视图模型中的一个属性:

        private EnumStatus filter;
        public EnumStatus Filter
        {
            get { return filter; }
            set
            {
                if (!filter.Equals(value))
                {
                    filter= value;
                    OnPropertyChanged("Filter");
                }
            }
        }

EnumStatus 是一个枚举:

public enum EnumEstatRemesa 
{        
    Pending,
    Approved,
    Reviewing
};

转换器:

public class ColumnVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        EnumStatus status = (EnumStatus)value;

        return (status == EnumStatus.Pending) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在窗口中创建资源:

<Window.Resources>
    <ColumnVisibilityConverter x:Key="ColumnVisibilityConverter"/>
</Window.Resources>

我的问题是永远不会调用转换器。为什么?

调试时,输出窗口显示:

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=DataContext.Filter; 数据项=空;目标元素是“DataGridTextColumn”(HashCode=20546761);目标属性是“可见性”(类型“可见性”)

4

1 回答 1

2

我在这里看到几个问题:

  1. 绑定表达式

删除“数据上下文”。绑定表达式中的字符串。

绑定扩展的默认行为是始终转到数据上下文。(其中包含视图模型)

  1. 数据上下文空

您发布的错误消息说明的第二件事是 dataitem 为空。看来您没有分配数据上下文。在你背后的代码中的某个地方应该 - 例如 - 有类似的东西

this.DataContext = new MyViewModel();
  1. 列没有数据上下文

DataGridColumns 不在 VisualTree 中,因此它们不会从父 DataGrid 获取数据上下文。请记住,列没有分配元素视图模型。它们独立于绑定到 ItemsSource 属性的项目的存在而存在。

所以你的绑定应该是这样的:

{绑定 DataContext.FilterViewModel[MyCol].Filter,Mode=FindAncestor, AncestorType=DataGrid}

“FilterViewModel[MyCol]”部分取决于您的视图模型的外观。

请注意,您需要在此处提供“DataContext”,因为绑定源将是 DataGrid,并且可以通过 DataGrid 的 DataContext 属性访问视图模型。在这种情况下,您需要在绑定中明确给出“DataContext”。

  1. 意图

你的问题不是很清楚你的意图是什么。但是,如果您的意图是隐藏数据网格的某些行:这根本无法通过 ColumnVisibility 工作。(看来您想过滤具有特定 ApporvalStatus 的行)

于 2018-01-15T15:16:48.433 回答