데이터 바인딩에 암시 적으로 입력 한 변수를 사용할 수 없습니다.
은 이제 개체 같은 TableA
, 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 {
성명에서 일을한다. Database
클래스가 그런 일을 찾고 함께
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();
}
}
:
public class MyConcreteClass
{
public TableA TableA { get; set; }
public TableB TableB { get; set; }
public TableC TableC { get; set; }
}
마지막으로, 당신은 당신의 LINQ 쿼리를 가지고있는 클래스의 모양은 다음과 같습니다 그래서 예를 들면
public class Database
{
public IEnumerable<TableA> TableA { get; set; }
public IEnumerable<TableB> TableB { get; set; }
public IEnumerable<TableC> TableC { get; set; }
}
01의 ItemsSource
속성을 설정하십시오.~ {Binding MyConcreteClass}
.
가장 중요한 포인트는
- 당신은 단지 속성에 바인딩 할 수 있습니다. 필드 나 메소드에 데이터 바인딩 할 수 없습니다.
- 암시 적 유형에 바인딩 할 수 없습니다.
는 뷰 - 모델이 필요한 경우 INotifyPropertyChanged
를 구현하고도 필요한 곳 ObservableCollection
의를 사용해야하는 것을 잊지 마십시오.
어떻게'DataGrid'의'DataContext'를 설정합니까? 'TableA'는'DataContext'의 속성입니까? 데이터 컨텍스트로 사용하고있는 객체가'INotifyPropertyChanged'를 구현합니까? – Guillaume
죄송합니다. 언급하는 것을 잊어 버렸습니다. 질문이 업데이트됩니다. – MemphiZ