2010-12-15 4 views
3

Entity Framework 컬렉션에 바인딩 된 WPF/C# 응용 프로그램에 DataGrid가 있습니다. 각 행에는 빈번하게 바뀌는 바운드 열 (초당 여러 번)이 있습니다. 이로 인해 열이 자주 변경되므로 기본적으로 열을 읽을 수 없습니다. 값이 0.1 초마다 변경 되더라도 WPF가 0.5 초마다 또는 1 초마다 새로운 값만 표시하도록하려면 어떻게해야합니까?바운드 데이터 격자의 새로 고침 빈도가 느림

dataGrid.MaxRefreshRate = 1000; (value in milliseconds). 
+0

이 질문은 WPF로 태그되었으므로 DataGrid를 사용한다고 생각하십니까? DataGridView는 Windows Forms입니다. 또한 열 또는 컬렉션이 빠르게 변경됩니까? –

+0

@Meleak - 네, 미안 해요 WPF에서 DataGrid 의미. 컬렉션이 빠르게 변경되므로 DataGrid가 INotifyPropertyChanged 이벤트에서 너무 자주 업데이트됩니다. DataGrid에서 속성 변경 이벤트 중 일부를 기본적으로 무시하고, 한 번만 업데이트하면됩니다. – Chad

+0

사용자가 DataGrid의 데이터를 업데이트 할 수 없습니까? 그렇지 않은 경우 동기화 문제를 확인하려면 지연된 업데이트로 해결해야합니다. – whoisthis

답변

2

에 더 좋은 답을 찾을 수 있음.

데이터가 List < Record> 유형이고 DataGrid에 바인딩되어 있다고 가정 해 보겠습니다.

데이터 (이 경우 한 행)에 대한 래퍼 클래스가 필요합니다. 이 래퍼는 속성을 변경하고 규칙적으로 실행합니다. 주의 사항 : 테스트를 거치지 않고이 코드를 작성 했으므로 버그가있을 수 있습니다. 또한 스레드로부터 안전하지 않으므로 목록을 사용하여 작업 할 때 잠금을 추가해야합니다. 그러나 요점은 타격을 받아야한다.

public class LazyRecord : INotifyPropertyChanged 
{ 
    private string name; 
    public string Name 
    { 
    get { return name; } 
    set 
    { 
     if (name != value) 
     { 
     name = value; 
     OnPropertyChanged("Name"); 
     } 
    } 

    // other properties 

    // now the important stuff - deffering the update 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.changedProperties.Find(propertyName) == null) 
     this.changedProperties.Add(propertyName); 
    } 

    private readonly List<string> changedProperties = new List<string>(); 

    // and the timer that refreshes the data 
    private readonly Timer timer; 
    private readonly Record record; 

    public LazyRecord(Record record) 
    { 
     this.timer = new Timer(1000, OnTimer); 
     this.record = record; 

     this.record.OnPropertyChanged += (o, a) => this.OnPropertyChanged(a.PropertyName); 
    } 

    public void OnTimer(..some unused args...) 
    { 
     if (this.PropertyChanged != null) 
     { 
     foreach(string propNAme in changedProperties) 
     { 
      PropertyChanged(new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

이 후, 당신의 목록 < 기록에서 목록 < LazyRecord>을 만들>와 데이터 소스로 것을 사용합니다. 분명히 훨씬 더 재사용 가능한 일반적인 솔루션을 사용하는 것이 간단합니다. 희망을 조금 도왔습니다.

+0

예제와 메모를 보내 주셔서 감사합니다. 나는 이것이 잘 작동 할 것이라고 생각한다. – Chad

-1

시도 listView.Items.Refresh();.

+0

글쎄, 나는 새로 고침을 강제하고 싶지 않아. 사실, 마지막 새로 고침에 너무 가까우면 일부 새로 고침을 취소하고 싶습니다. 나는 dataGridView.Items.DeferRefresh()를 찾았지만 사용법이나 올바른 방법 일지는 모르겠다. 나는 시도했다 : using (dataGridView.Items.DeferRefresh()) { Thread.Sleep (500); } – Chad

1

작동 원리.

  • 원본 데이터를 바인딩하는 대신 gui 요소에 데이터의 섀도 복사본을 바인딩하십시오.
  • 섀도 복사본을 원래 데이터에서 일정한 지연으로 업데이트하는 이벤트 처리기를 추가하십시오.

는 유사한 새로운 질문 나는 당신이 당신의 데이터와 데이터 그리드 사이에 레이어를 만들 필요가 있다고 생각 how-to-do-the-processing-and-keep-gui-refreshed-using-databinding

+0

아이디어와 링크를 보내 주셔서 감사합니다. 링크의 답변 중 하나는 재사용하기에 충분하고 일반적으로 보였습니다. 물론, 여전히 DataGrid에 내장 된 뭔가가 있었으면 좋겠다고 생각하는 일반적인 문제처럼 보입니다. – Chad

관련 문제