0

我有以下查询:

var qry = from itemA in db.TableA 
          join itemB in db.TableB on itemA.ID equals itemB.ID  
          join itemC in db.ItemC on itemA.ID equals itemC.ID  
          select new { itemC, itemA, itemB};

如果我现在将查询绑定到 Datagrid,如下所示:

dgTest.ItemsSource = qry;

并像这样配置 Datagrid 的 TextColumn:

<DataGrid x:Name="dgTest" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Test" Binding="{Binding TableA.Name}"/>
    </DataGrid.Columns>
</DataGrid>

该列是空的......
谁能告诉我我做错了什么?

提前致谢!

4

1 回答 1

2

您不能为数据绑定使用隐式类型变量。

让我们假设你的 object ,TableA看起来像这样:TableBTableC

public class TableA
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class TableB
{
    public int ID { get; set; }
}

public class TableC
{
    public int ID { get; set; }
}

现在您需要创建一个具体的类,而不是像在select new {语句中那样使用隐式类型。

例如:

public class MyConcreteClass
{
    public TableA TableA { get; set; }
    public TableB TableB { get; set; }
    public TableC TableC { get; set; }
}

最后,您有 LINQ 查询的类应如下所示:

public class MyDataSource : INotifyPropertyChanged
{
    private Database db;

    public MyDataSource()
    {
        db = new Database()
        {
            TableA = new List<TableA> 
            {
                new TableA { ID = 1, Name = "Hello world!" }
            },
            TableB = new List<TableB>
            {
                new TableB { ID = 1 }
            },
            TableC = new List<TableC>
            {
                new TableC { ID = 1 },
                new TableC { ID = 2 }
            }
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public IEnumerable<MyConcreteClass> MyConcreteClass
    {
        get { return this.MyQuery(); }
    }

    private IEnumerable<MyConcreteClass> MyQuery()
    {
        var qry = from itemA in db.TableA
                  join itemB in db.TableB on itemA.ID equals itemB.ID
                  join itemC in db.TableC on itemA.ID equals itemC.ID
                  select new MyConcreteClass
                  {
                      TableA = itemA,
                      TableB = itemB,
                      TableC = itemC
                  };

        return qry.AsEnumerable();
    }
}

随着Database班级寻找类似的东西:

public class Database
{
    public IEnumerable<TableA> TableA { get; set; }
    public IEnumerable<TableB> TableB { get; set;  }
    public IEnumerable<TableC> TableC { get; set;  }
}

并将ItemsSource您的属性设置DataGrid{Binding MyConcreteClass}.

最重要的几点是:

  • 您只能绑定到一个属性。您不能将数据绑定到字段或方法。
  • 您不能绑定到隐式类型。

如果需要,不要忘记实现您的视图模型INotifyPropertyChanged,并在需要时使用ObservableCollections 。

于 2012-05-26T13:00:34.907 回答