如何将LINQ结果绑定到DataGrid,只有一列?

时间:2016-09-18 18:58:18

标签: c# .net linq lambda

我的视图中有ItemsSource="{Binding GetValues, Mode=TwoWay}"的DataGrid。

在我的ViewModel中: private List getValues = new List();

public List<Language> GetValues
{
    get { return getValues; }
    set { SetField("GetValues", ref getValues, value); }
}

在这种情况下,一切都很好:

DatabaseDataContext myDB = new DatabaseDataContext();
var query = myDB.Languages.Where(u => u.Valid == true).ToList();
GetValues = query;

但是我想在我的DataGrid中只有一列,所以尝试了这个:

DatabaseDataContext myDB = new DatabaseDataContext();
var query = myDB.Languages
                       .Where(u => u.Valid == true)
                       .Select(u => new { Name = u.Title });
GetValues = query.ToList();
  

&#34;无法隐式转换类型   &#39;&System.Collections.Generic.List LT;&GT;&#39;至   &#39; System.Collections.Generic.List&#39;&#34;

有解决这个问题的好方法吗?

3 个答案:

答案 0 :(得分:0)

问题query returns a anonymous object,您尝试将此匿名对象列表分配到语言类型列表。

解决方案更改您的Linq query to select a object of type Language而不是匿名对象。

这必须帮助

var query = myDB.Languages
                       .Where(u => u.Valid == true)
                       .Select(u => new Language { Title = u.Title });

然后当您对.ToList()进行GetValues时,app.config['JSON_AS_ASCII'] = False 的结果和数据类型将匹配。

答案 1 :(得分:0)

您收到错误,因为GetValues的类型为List<Language>,但您尝试将其设置为动态创建的匿名类型。要解决此问题,您应该创建一个代表所需数据的新类。

public class LanguageTitle
{
    public string Name { get; set; }
    // Other needed properties
}

然后将属性添加到视图模型中:

public List<LanguageTitle> LanguageTitles
{
    get { return languageTitles; }
    set { SetField("GetLanguageTitles", ref languageTitles, value); }
}

在您的查询中选择LanguageTitle

DatabaseDataContext myDB = new DatabaseDataContext();
var query = myDB.Languages
                       .Where(u => u.Valid == true)
                       .Select(u => new LanguageTitle { Name = u.Title });
LanguageTitles = query.ToList();

并将DataGrid绑定到此媒体资源:

ItemsSource="{Binding LanguageTitles, Mode=TwoWay}"

答案 2 :(得分:0)

为什么会有一个对象:

public List<Language> GetValues
{
    get { return getValues; }
    set { SetField("GetValues", ref getValues, value); }
}

但您不希望从该对象填充所有属性。这是一个不好的做法,所以重新使用对象因为它们几乎相似。 您可能希望将属性GetValues更改为

public List<string> GetValues {get;set;}

然后在您的linq查询中,您可以使用:

GetValues = myDB.Languages
                   .Where(u => u.Valid == true)
                   .Select(u =>  u.Title)
                   .ToList();