Silverlight 2에서 이질적인 뷰 모델 컬렉션을 렌더링
-
13-09-2019 - |
문제
형식화 된 컨텐츠를 나타내는 View 모델의 계층 구조가 있습니다.
public abstract class ContentPartViewModel : ViewModel
{
}
public class TextContentPartViewModel : ContentPartViewModel
{
public string Text { ... }
}
public class TitleContentPartViewModel : TextContentPartViewModel
{
}
public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
public string Uri { ... }
}
나는 모음을 포함하는 포괄적 인보기 모델이 있습니다. ContentPartViewModel
s 렌더링 :
public class ContentViewModel
{
public ICollection<ContentPartViewModel> ContentParts { ... }
}
그런 다음 a ContentView
이는 콘텐츠의 모든 부분을 렌더링합니다.
<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
이상적인 세상에서 나는 단지 DataTemplate
각 컨텐츠 부품 유형에 대해 그에 따라 렌더링됩니다. 그러나 Silverlight는 지원하지 않습니다 DataType
에 속성 DataTemplate
클래스, 그래서 그것은 옵션이 아닙니다.
또 다른 옵션은 a를 제공하는 것입니다 DataTemplateSelector
보기 모델 유형에서 매핑을 수행합니다 DataTemplate
내 자신. 아아, ItemsControl
SL2에는 AN이 없습니다 ItemTemplateSelector
속성 - 만 ItemTemplate
재산.
그것은 나에게 선택의 여지가없는 것 외에는 ItemTemplate
그런 다음 변환기를 사용하여 해당 컨텐츠 부분과 관련된 조각을 제외하고 모든 UI를 끄십시오.
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Text}" FontWeight="Bold" Visibility="{Binding Converter={StaticResource TitleContentPartConverter}}"/>
<TextBlock Text="{Binding Text}" Visibility="{Binding Converter={StaticResource TextContentPartConverter}}"/>
<HyperlinkButton Content="{Binding Text}" NavigateUri="{Binding Uri}" Visibility="{Binding Converter={StaticResource HyperlinkContentPartConverter}}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
이것은 성능과 코드의 가독성/정확성 모두에서 분명히 끔찍합니다. 또한 출력을 올바르게 포맷하기가 훨씬 어렵습니다. 그래서 질문 :
- 누구든지 SL2에서 더 나은 방법을 추천 할 수 있습니까?
- SL3에서 상황이 개선되었는지 여부를 확인할 수 있습니까?
감사합니다, 켄트
해결책
예. DataTemplate의 데이터 유형은 Silverlight 2 또는 Silverlight 3에서 지원되지 않습니다.
Silverlight의 ItemTemplatesEctor를 둘러 볼 수 있습니다. 이 샘플을 살펴보십시오.
http://silverlight.net/forums/t/12598.aspx
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
DataTemplateSelector selector = this.ItemTemplateSelector;
if (null != selector)
{
((ContentPresenter)element).ContentTemplate = selector.SelectTemplate(item, element);
}
}