2012-04-18 5 views
0

DataGrid의 itemsource를 List에 바인딩하는 방법을 알아 내려고하고 있습니다. 특히, 나는 테이블 떨어져 데이터를 가져옵니다, 그리고 목록으로 변환 SQL에 LINQ 사용하고 있습니다 :WPF + List에 DataGrid ItemSource 바인딩

 var tempTable = (from p in dc.LiveData 
         select new Custom_GridResult 
         { x = p.x, 
           y = p.y, 
           z = p.z 
         }).ToList(); 
     dataGrid.ItemsSource = tempTable.ToList();  

public class CustomETO_GridResult 
{ 
    public CustomETO_GridResult() 
    { } 
    double x { get; set; } 
    public double y{ get; set; } 
    public double z{ get; set; } 

} 

내 계획하는 것입니다 (이 지속적으로 업데이트 될 때) 데이터 몇 분 간격으로 다시 끌어 내 DataGrid에서 변경 사항을 자동으로 반영하고 싶습니다. ItemsSource를 계속해서 다시 설정하는 것이 더 쉬울까요? 아니면 다른 방법이 있습니까?

덕분에 많은

편집 : 데이터베이스 행의 상수를 (그들은 미리 정의되어 있습니다) 가지고 내가 추가 한 것이다. 지속적으로 업데이트되는 것은 데이터베이스의 값입니다. 예를 들어 항공기의 데이터베이스와 행 값이 비행기가 비행중인 GPS 좌표로 지속적으로 업데이트되는 것처럼 가장합니다.

+0

나열된 코드는 어떻게됩니까? – Jahmic

답변

3

DataGrid가 소스 컬렉션에서 업데이트를 수신하려면 INotifyCollectionChanged을 구현해야합니다. 다행히도 ObservableCollection이 이미이를 수행합니다. 데이터베이스 쿼리에서 ObservableCollection을 채우고 DataGrid를 ObservableCollection에 바인딩하십시오.

는 업데이트 :

더 좋은 대답은 MVVM 패턴을 사용하는 것입니다. 데이터베이스와 인터페이스하는 Model 클래스와 프레젠테이션을 위해 데이터를 준비하지만 ObservableCollection (예를 들어)에 넣는 ViewModel 클래스를 만들 수 있습니다. 그런 다음 뷰는 DataGrid의 ItemsSource를 ObservableCollection으로 설정하는 ViewModel에 바인딩됩니다. MVVM을 시작하려면 this post을 참조하십시오.

업데이트 # 2 : 컨트롤 생성자에서 ViewModel의 인스턴스를 만들고이를 컨트롤의 DataContext에 할당합니다. DataGrid는 ViewModel의 Results 속성에 바인딩됩니다. ObservableCollection의 내용이 변경되면 DataGrid의 내용이 자동으로 업데이트됩니다. N

코드 :

public class ViewModel 
{ 
    public ObservableCollection<CustomETO_GridResult> Results {get;set;} 


    // Call this method to update the ObservableCollection, obviously could use some optimization 
    public void UpdateFromDatabase() 
    { 
     var query = // make your database query 
     Results.Clear(); 
     foreach(CustomETO_GridResult result in query) 
       Results.add(result); 
    } 

    ... // Initialize ObservableCollection, do other work, etc. 
} 

XAML : 킵은 새로운 데이터를 당기는 때 관찰 모음으로 TEMPTABLE를 넣어

<DataGrid ItemsSource="{Binding Results}"/> 
+0

이렇게하면 코드를 어떻게 작성해야합니까? 그런 의미에서 ObservableCollection을 클래스의 정적 필드로 만들어야하고 모든 새 데이터를 가져올 때 인스턴스를 덮어 씁니까? – keynesiancross

+0

필자는 데이터베이스 테이블의 행 수가 항상 동일해야한다는 점을 유의해야합니다. 각 행의 열 값은 항상 변경됩니다 (예 : 표준 "새 행 추가"유형 테이블 설정 ...). – keynesiancross

+0

안녕 Dan - 위의 응답에 관해서. 빠른 질문 ... ObservableCollection을 업데이트하는 가장 좋은 방법에 대한 생각은 내 데이터 집합 크기가 절대로 변경되지 않는다는 것입니다 (즉, 새로운 행 등이 아님). – keynesiancross

1

는 밀어 유지하고 데이터 그리드의 ItemsSource (한번의 과정)에 그 할당 그것은 당신의 관찰 할 수있는 수집에서, 그것은 당신을 위해 마법의 나머지를 할 것입니다.

관련 문제