データバインディングに暗黙的に型指定された変数を使用することはできません。
objectTableA
を想定して、次のようにしますTableB
。TableC
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}
。
最も重要なポイントは次のとおりです。
- プロパティにのみバインドできます。フィールドまたはメソッドにデータバインドすることはできません。
- 暗黙の型にバインドすることはできません。
必要に応じてビューモデルを実装し、必要に応じてsINotifyPropertyChanged
を使用することも忘れないでください。ObservableCollection