转换器没有开火

时间:2018-01-15 14:34:58

标签: c# wpf mvvm datagrid datagridtextcolumn

我的数据网格中有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:路径= DataContext.Filter;的DataItem = NULL;目标   element是'DataGridTextColumn'(HashCode = 20546761);目标财产   是'可见性'(类型'可见性')

1 个答案:

答案 0 :(得分:2)

我在这里看到几个问题:

  1. 绑定表达
  2. 删除&#34; DataContext。&#34; Binding表达式中的字符串。

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

    1. DataContext null
    2. 您提出的错误消息所述的第二件事是dataitem为null。看来你没有分配一个datacontext。你应该在代码背后的某个地方 - 例如 - 有像

      这样的东西
      this.DataContext = new MyViewModel();
      
      1. 列没有datacontext
      2. DataGridColumns不在VisualTree中,因此它们无法从父DataGrid获取datacontext。请记住,列没有分配元素视图模型。它们独立存在于与ItemsSource属性绑定的Items的存在。

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

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

        部分&#39; FilterViewModel [MyCol]&#39;取决于您的视图模型的外观。

        请注意,您需要提供&#39; DataContext&#39;这里的绑定源是DataGrid,viewmodel可以通过DataGrid的DataContext属性访问。在这种情况下,您需要提供DataContext&#39;在结合中明确地说。

        1. 意图
        2. 在你的问题中,你的意图是什么并不是那么清楚。但是,如果您的目的是隐藏datagrid的某些行:这根本不能通过ColumnVisibility工作。 (看来你想用特定的ApporvalStatus过滤行)