2011-08-08 1 views
0

다음 시나리오를 사용하십시오. 개체가 들어있는 목록에 바인딩 된 DataGrid가 있습니다. 각 객체는 다양한 데이터 (이름, 고객, 서버 이름 등)가있는 행을 나타냅니다. 이제는 동일한 객체 또는 행 (이름, 고객, 서버 이름 등)이 동일 할 수 있다고 가정 해 봅시다.Overriden IsEqual 메서드를 사용하여 목록에 바인딩 할 때 DataGrid ID 문제가 발생했습니다.

목록을 DataGrid에 바인딩하면 모든 것이 잘 작동하고 커서로 표를 이동할 수 있습니다. 그러나 UnitTests를 만들기 위해 문제의 개체에 대한 Equals 메서드를 재정의했습니다. 이처럼 :

public override bool Equals(object obj2) 
{ 
    ConnectionDestination compareObject = obj2 as ConnectionDestination; 
    if (compareObject == null) 
    { 
     return false; 
    } 


    if ((this.Kunde != compareObject.Kunde) || this.Filiale != compareObject.Filiale || this.Bez != compareObject.Bez || 
      this.Username != compareObject.Username || this.Password != compareObject.Password) 
    { 
     return false; 
    } 
} 

    public override int GetHashCode() 
    { 
     return this.Kunde.GetHashCode()^this.Bez.GetHashCode()^this.Filiale.GetHashCode()^this.Servername.GetHashCode()^this.Username.GetHashCode()^this.Password.GetHashCode(); 
    } 

이제 문제는 내가이 개 정확히 동일한 행이와 Equals 메서드가 호출되면, 데이터 그리드 혼란 가져옵니다과 여러 행을 선택하거나 내가 그리드를 통해 이동이 더욱 혼란 가져옵니다.

따라서 질문 : 그러한 문제가 발생하지 않도록 적절한 평등 비교 방법을 사용할 수 있습니까?

답변

0

동작이 정확하며 모든 WPF 목록이 선택 논리를 구현하는 방법에 대한 논리를 따릅니다. 해결 방법으로 볼 수있는 유일한 방법은 항목 소스에서 사용하기 전에 항목을 래핑하는 것입니다.
MVVM 패턴을 사용하여 작업 할 경우 행당 ViewModel로 연결됩니다.

DataGrid의 부작용 : GetHashCode() - 메서드가 동일한 개체에 대해 동일한 값을 반환하도록주의하십시오. 그렇지 않으면 선택에 문제가 있습니다. 귀하의 예제에서 GetHashCode()를 재정의했는지는 알 수 없습니다. Equals()를 재정의하는 경우 GetHashCode()를 재정의하는 것이 필수적이므로 실제 문제는 아니므로 언급하고 싶습니다.

+0

팁 주셔서 감사합니다! 나는 그걸 조금 더 가지고 놀 것이다 ... GetHashCode 메서드를 재정의하는 방법 : 나는 그걸 잘 해냈다.하지만 내 게시물에 그것을 추가하는 것을 잊어 버렸다. 이제 끝났어! – Artimidor

관련 문제