2012-05-25 3 views
0

에 가입-QRY 바인딩 나는 다음과 같은 쿼리가 :WPF Linq는 데이터 그리드

dgTest.ItemsSource = qry; 

과 같은 데이터 격자의 TEXTCOLUMN을 구성

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 x:Name="dgTest" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Test" Binding="{Binding TableA.Name}"/> 
    </DataGrid.Columns> 
</DataGrid> 

열이 비어 ...
는 사람이 말할 수 내가 뭘 잘못하고있어?

미리 감사드립니다.

+0

어떻게'DataGrid'의'DataContext'를 설정합니까? 'TableA'는'DataContext'의 속성입니까? 데이터 컨텍스트로 사용하고있는 객체가'INotifyPropertyChanged'를 구현합니까? – Guillaume

+0

죄송합니다. 언급하는 것을 잊어 버렸습니다. 질문이 업데이트됩니다. – MemphiZ

답변

2

데이터 바인딩에 암시 적으로 입력 한 변수를 사용할 수 없습니다.

은 이제 개체 같은 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 { 성명에서 일을한다. 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의를 사용해야하는 것을 잊지 마십시오.

+0

문제는 : LinqToEntities 사용하고 있고 클래스는 이미 Linq에 의해 만들어집니다. 그 조인 qry 하나의 데이터 표에 3 테이블의 열을 추가 할 수 있어야합니다 ... – MemphiZ

+0

당신이 필요로하는 열 정보를 보유하고 당신의 엔티티에 테이블과 마찬가지로 그것을 추가 DB에 뷰를 만들 여부. 또는 'MyConcreteClass'와 같은 커스텀 객체를 생성하고이 객체에 대한 변경을 처리하여 객체에 반영시킬 필요가 있습니다. 내 답변은 일반적인 대답 일 뿐이므로 코드에 맞게 수정해야합니다. 묵시적인 타입에 바인딩 할 수 없다는 것을 명심하십시오. – Guillaume

+0

Linq가 만든 3 개의 클래스를 보유하는 클래스를 만들었습니다. 매력처럼 작동합니다! 고맙습니다! – MemphiZ