2009-03-05 4 views
1

외부 소스에서 현재 데이터 인터페이스 외부에서 특정 엔터티가 변경되었다는 알림을받는 상황에 처해 있습니다. 엔티티를 찾고 통화 새로 고침을 할 수 있습니다.DataContext Refresh and PropertyChanging & PropertyChanged 이벤트

MyDataContext.Refresh (RefreshMode.OverwriteCurrentValues, myEntity);

엔티티에서 변경된 속성이 올바르게 업데이트됩니다. 그러나 INotifyPropertyChanging INotifyPropertyChanged 중 어느 쪽도 새로 고침이 발생할 때 발생하는 것으로 보이지 않으므로 UI에 잘못된 정보가 표시됩니다.

변경 알림 이벤트를 발생시키기 위해 Refresh()가 엔티티에서 올바른 속성 게터 및 설정자를 사용하지 못했지만 동일한 작업을 수행하는 다른 방법이있을 수 있습니다.

내가 잘못 했나요? 새로 고침보다 효과적인 방법이 있습니까? Refresh가 유일한 옵션 인 경우 누구나 해결할 수 있습니까?

답변

2

비슷한 문제가있었습니다. TreeView 바인딩하고 편집 작업을 취소하는 사용자 응답하여 새로 고침 호출해야했습니다. Refresh() 메서드는 모든 원래 값을 순전하게 반환하지만 TreeView UI에는 반영되지 않았습니다. 전능하신 구글과 협의 한 후,이 솔루션을 통해 온 :

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh(); 

이 모든 것을 업데이트 내 트 리뷰를 강제로 보인다. 유일한 단점 (그리고 꽤 중요한 것)은 모든 트리 노드를 붕괴하는 것처럼 보이므로 사용자가 자신의 자리를 잃을 수 있습니다. 나는 단지 ItemsSource을 null로 설정하고 다시 ... 같은 효과를 낼 수 있습니다. 단 하나의 바인딩 된 텍스트 상자가 있다면이 방법이 더 간단 할 수 있습니다. 모든 단일 텍스트를 다시 바인딩 할 필요가 없으므로 마찬가지입니다.

더 나은 해결책이 있습니까?

편집 : 예 내

스마트 한보다 나 동료가 트릭을 할 것이 솔루션을 함께했다 ...이 있습니다.

context.Refresh(RefreshMode.OverwriteCurrentValues, employee); 
employee.SendPropertiesChanged(); 

모든 UI 요소가 메시지를받을 적절으로 업데이트 :

public void SendPropertiesChanged() 
{ 
    foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties()) 
    SendPropertyChanged(prop.Name); 
} 

당신은 당신의 응용 프로그램 코드에서이 호출 할 수 있습니다 다음 Linq2Sql 객체에 대한 부분 클래스에 다음 코드를 추가 . 이것은 트리 뷰 컨트롤과 바인딩을 새로 고칠 때 UI가 "재설정"된 것처럼 보이지 않는 곳에서도 작동합니다.

0

Refresh()를 호출하는 것을 알고 있다면 어쨌든 그 시점에서 UI를 새로 고치지 않는 이유는 무엇입니까?

PropertyChanging 및 PropertyChanged는 LINQtoSQL DBML 생성 엔터티 클래스에서 setter를 호출하여 호출됩니다. 새로 고침()을 호출하면 해당 작업이 수행되지 않습니다.

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)] 
public string DisplayName 
{ 
    get 
    { 
     return this._DisplayName; 
    } 
    set 
    { 
     if ((this._DisplayName != value)) 
     { 
      this.OnDisplayNameChanging(value); 
      this.SendPropertyChanging(); 
      this._DisplayName = value; 
      this.SendPropertyChanged("DisplayName"); 
      this.OnDisplayNameChanged(); 
     } 
    } 
} 
+0

Rex, 새로 고침()은 컨트롤러/"거의 비즈니스 계층"수준에서 수행되며 UI 근처에 있지 않으므로 수동 새로 고침이 필요하지 않습니다. Refresh()가 Enity 데이터를 변경하면 변경된 이벤트를 발생시켜야합니다. 실제로 수행하지 않는다는 사실은 저에게 총괄 감독처럼 보입니다. – Scott

+0

@Scott 어쩌면 그것은 감시이지만, 우리가 변경할 수없는 코드 인 반면, 당신은 그렇습니다. 새로 고침()을 호출하고 UI에서 해당 속성에 연결할 때 호출하는 DataContext 클래스에 이벤트를 추가하지 않는 이유는 무엇입니까? 이는 엔티티의 이벤트에서 얻은 SoC에 가깝습니다. –

관련 문제