使用带转换器的数据网格收集匿名类型

时间:2013-12-05 16:15:24

标签: c# wpf datagrid

是否可以使用转换器返回绑定到.ToList()的{​​{1}}的匿名类型的集合Itemssource

我试过这个:

//转换器

Datagrid

// xaml中的数据网格声明

 class AnonymousTypeToListConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((ObservableCollection<Object>)value).ToList();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }

这似乎不起作用 - <DataGrid ItemsSource="{Binding SelectionData, Converter={StaticResource anonConverter}}" AutoGenerateColumns="True"/> 被调用但我的Converter为空:

enter image description here

我的理由是因为Datagrid不喜欢匿名类型...如定义here但我不认为这种方法对我们使用MVVM方法真的有效... < / p>

2 个答案:

答案 0 :(得分:0)

评论很难阅读,所以我会继续回答。

他的意思是他无法使用IEnumerable作为DataContext,因此他选择了选项来调用ToList()来转换它进入List。正如我在上次评论中向您展示的那样,他可以轻松地将IEnumerable传递给ObservableCollection<T>构造函数:

DataContext = new ObservableCollection(
    list.Select(v => new { id = v, name = "name " + v })); 

ObservableCollection<Location>投射到您ObservableCollection<Object>中的Converter就好了。无论如何我还是不知道它是什么,但你最好这样做:

public object Convert(object value, Type targetType, object parameter, 
CultureInfo culture)
{
    return new ObservableCollection<Location>((ObservableCollection<Location>)value);
}

当然,将ObservableCollection<Location>转换为ObservableCollection<Location>然后将其传递给新的ObservableCollection<Location>是没有意义的,但我猜你实际上会做其他事情在那里。

如果您告诉我们您使用Converter实际尝试实现的目标,那么您可能会得到更好的答案吗?

答案 1 :(得分:0)

具有匿名类型的对象是内部的。只有在完全信任的情况下运行时,才能绑定到匿名类型的属性。

通常,应限制Internet应用程序直接访问关键系统资源,以防止恶意破坏。默认情况下,HTML和客户端脚本语言无法访问关键系统资源。由于Windows Presentation Foundation(WPF)浏览器托管的应用程序可以从浏览器启动,因此它们应该符合一组类似的限制。为了实施这些限制,WPF依赖于代码访问安全性(CAS)和ClickOnce。

简而言之,WPF使用部分可信安全性运行,因此默认情况下Binding不能与匿名类型一起使用。

但我敢打赌互联网上有“解决方法”。 :)