2011-04-21 1 views
6

나는 형태의 바인딩이 있습니다WPF 바인딩은 인덱서 속성과 목록 요소를 어떻게 구별 할 수 있습니까?

Path=SpecialCollection[0] 

SpecialCollection 클래스는 ObservableCollection에를 확장 인덱서 속성이 있습니다.

public T this[string propertyValue] 
{ 
    get 
    { 
     // do stuff 
     return default(T); 
    } 
} 

내 문제는 바인딩에서 컬렉션의 0 번째 항목을 반환하는 대신 인덱서 속성 값을 가져 오려고한다는 것입니다. 컬렉션의 인덱서 속성의 getter를 호출하는 대신 컬렉션 요소를 반환하도록 바인딩을 강제로 정수 0으로 처리하는 방법이 있습니까?

+0

분명히 인덱서를 사용하면 실제 인덱서가 호출됩니다. 어쨌든'default (T)'를 반환하면 정확히 무엇을하고 있습니까? 정말 인덱서에 과부하가 필요합니까? –

+0

@ H.B. 내가 추가 한 'do stuff'주석을 보게 될 것입니다. 세부 사항을 추상화하려는 의도입니다. FWIW,이 특정 컬렉션 클래스는 propertyValue와 값이 일치하는 속성을 가진 첫 번째 항목을 검색합니다. 우리가 이것을하지 않겠다는 것을 제안한다면, 그것은 변하지 않을 것이기 때문에, 그것을 해결하려는 나의 욕구가 있습니다. – Craig

+0

나는'DoStuff'에 대해 알고 있었지만 이름에서 알 수 있듯이 인덱스는 일종의 색인을 통해 항목에 액세스하는 데에만 사용해야한다고 생각합니다. (모든 종류의 작업이이 작업과 일치하지 않으면 기본값 (T) 반환) –

답변

14

According to MSDN 당신이 값의 유형이 인덱스로 입력 바인딩을 알 수 있습니다 :

내부 인덱서는 쉼표로 구분 된 여러 인덱서 매개 변수를 가질 수있다 (,). 각 매개 변수의 유형은} 호로 지정할 수 있습니다. 예를 들어, Path = "[(sys : Int32) 42, (sys : Int32) 24]"를 가질 수 있습니다. 여기서 sys는 System 네임 스페이스에 매핑됩니다.

나는 PropertyPath 생성자이 시나리오에서 하지 작업을 수행 말했다 Binding constructor taking a path string 기본 PropertyPath 형식 변환기 아닌 다른 PropertyPath 생성자를 사용하는 것으로 나타났습니다. 이 문제를 방지하려면 형식 변환기를 통해 변환을 호출하는 Path 속성을 수동으로 설정하여 Binding 생성자를 피하십시오.

<!-- Does not work --> 
<TextBlock Text="{Binding [(sys:Int32)0]}"/> 
<!-- Does work --> 
<TextBlock Text="{Binding Path=[(sys:Int32)0]}"/> 
+0

Beautiful, thank you. 나는 이것을 잠시 후에 보았지만 그것이 무엇을 수반했는지 기억할 수 없었다. – Craig

+0

@Craig : 다중 색인 참조에 섞여있는 것은 매우 불행한 일입니다. 아마도 내가이 질문을했을 때 다시 볼 수 없었던 이유 일 수 있습니다. –

1

실제로 두 개의 인덱서 속성이 있습니다. 하나는 int 인수이고 다른 하나는 string 인수입니다. 솔직히 말하면 바인딩식이 모호 할 때 사용할 인덱서를 선택하는 방법을 모르겠습니다. 하나만 있으면 인덱스를 인덱서 인수의 유형으로 강제 변환 할 수 있습니다. 두 개가있는 경우 예외를 throw하거나 경험적 방법에 따라 예외를 선택할 수 있습니다. 이 경우 분명히 잘못된 것을 선택했습니다.

이 문제를 해결하려면 문자열 인덱서를 "수준 아래로"이동하여 새로운 속성에 매달아 목록 인덱서와 경쟁하지 않도록하거나 필요한 경우 List[0]을 추가하면됩니다. First 속성을 사용하고 인덱서 중 하나를 건너 뜁니다.

+0

나는이 접근법에 정착했다. 인덱스 0에서 2까지 액세스해야하므로 래퍼 속성이 최상의 접근 방식으로 밝혀졌습니다. 인덱서를 int로 캐스팅하는 방법에 대해 한 번 읽었을 수도 있습니다. – Craig

+0

또는 순전히 숫자 문자열을 인식하고 다른 인덱서로 변환 할 수있는 문자열 인덱서가 있어야합니다. ** is (키는 순전히 숫자 임) return [Int32.Parse (key)]; ** –

관련 문제