我的数据网格中有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);目标财产 是'可见性'(类型'可见性')
答案 0 :(得分:2)
我在这里看到几个问题:
删除&#34; DataContext。&#34; Binding表达式中的字符串。
绑定扩展的默认行为是始终转到数据上下文。 (其中包含视图模型)
您提出的错误消息所述的第二件事是dataitem为null。看来你没有分配一个datacontext。你应该在代码背后的某个地方 - 例如 - 有像
这样的东西this.DataContext = new MyViewModel();
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;在结合中明确地说。
在你的问题中,你的意图是什么并不是那么清楚。但是,如果您的目的是隐藏datagrid的某些行:这根本不能通过ColumnVisibility工作。 (看来你想用特定的ApporvalStatus过滤行)