문제

형식화 된 컨텐츠를 나타내는 View 모델의 계층 구조가 있습니다.

public abstract class ContentPartViewModel : ViewModel
{
}

public class TextContentPartViewModel : ContentPartViewModel
{
    public string Text { ... }
}

public class TitleContentPartViewModel : TextContentPartViewModel
{
}

public class HyperlinkContentPartViewModel : TextContentPartViewModel
{
    public string Uri { ... }
}

나는 모음을 포함하는 포괄적 인보기 모델이 있습니다. ContentPartViewModels 렌더링 :

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>

이것은 성능과 코드의 가독성/정확성 모두에서 분명히 끔찍합니다. 또한 출력을 올바르게 포맷하기가 훨씬 어렵습니다. 그래서 질문 :

  1. 누구든지 SL2에서 더 나은 방법을 추천 할 수 있습니까?
  2. SL3에서 상황이 개선되었는지 여부를 확인할 수 있습니까?

감사합니다, 켄트

도움이 되었습니까?

해결책

  1. 예. DataTemplate의 데이터 유형은 Silverlight 2 또는 Silverlight 3에서 지원되지 않습니다.

  2. 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);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top