2010-08-11 2 views
0

하나의 항목을 Itemssource에서 다른 항목으로 변환하려면 어떻게해야합니까?itemssource에서 항목을 변환하는 방법

예를 들어 TypeB 컬렉션에 직접 TypeB에 연결되어 있지 않지만 ItemTemplate에서 TypeB에 액세스해야합니다.

<DataGrid ItemsSource={Binding SomeCollectionOfTypeAWhichCanBeConvertedByAlgorithm}> 
    <DataGridTextColumn Binding="{Path=PropertyOfTypeB}" /> 
</DataGrid> 
+0

작은 예를 들어 보겠습니다. –

+0

네,이 질문에 대답하기에 충분하지 않습니다. –

+0

추가 된 예, 1 번 답 참조 – Falcon

답변

1

Pair 클래스를 사용하고 항목 소스를 컬렉션에 바인딩하는 결과가 발생했습니다.

0

예 : 나는 템플릿 내에서 b를 입력 할 TYPEA에서 컬렉션의 항목을 변환하는 방법을 검색

<DataGrid ItemsSource="{Binding CollectionOfTypeAWhichCanBeConvertedToTypeB}" > 
    <DataGridTextColumn Binding="{Binding Path=PropertyOfTypeB}" /> 
</DataGrid> 

. 참조를 유지해야하므로 Property-Binding에 변환기를 사용할 수 없습니다.

그리고 B에서 A에 대한 참조를 가질 수 없으며 그 반대도 마찬가지입니다.

0

TypeA가 TypeB의 하위 유형이 아니라면 작동하지 않을 것입니다. 가장 좋은 방법은 항목을 ItemSource에 바인딩하기 전에 항목을 typeB로 변환하는 것입니다.

맞는다면 Automapper를 시도하거나 .NET 4 인 경우 역학을 시도하십시오.

public ObservableCollection<TypeA> ItemsOfTypeA { get; set; } 

private ObservableCollection<TypeB> _ItemsOfTypeB; 

public ObservableCollection<TypeB> ItemsOfTypeB 
{ 
    get 
    { 
     if (_ItemsOfTypeB == null) 
     { 
     var converted = ItemsOfTypeA.Select(ConvertTypeAToTypeB); 
     _ItemsOfTypeB = new ObservableCollection<TypeB>(converted); 
     } 
     return _ItemsOfTypeB; 
    } 
} 

private TypeB ConvertTypeAToTypeB(TypeA a)... 

내가의 컬렉션 관찰했습니다 : 그것은 내부적으로는 같이 보일 것이다 타입 B의 컬렉션을 노출 있도록 뷰의 모델을 확장하기 만 할거야 무엇

+0

그러나 예를 들어 그리드 내에 Type A와 B의 속성이 필요합니까? 그래서 래퍼 또는 페어 클래스가 필요할 것입니다. – Falcon

0

이 예제는 TypeA 컬렉션이 변경 될 예정이며 UI에 전파하기 위해 이러한 변경 사항이 필요합니다. 해당 속성에서 CollectionChanged 이벤트를 처리하고 항목 추가, 항목 제거 및 TypeB 컬렉션 새로 고침이 필요합니다 제기 될 때. 이것은 에 어떤 TypeA 객체가 어떤 TypeA 객체를 생성했는지 알 수있는 방법이 필요하므로 TypeA 객체가 제거 될 때 TypeB 컬렉션에서 제거 할 객체를 알 수 있습니다.

관련 문제