1

で表示モデルの異種コレクションをレンダリング:私はフォーマットされたコンテンツを表すビューモデルの階層構造を持っているのSilverlight 2

public abstract class ContentPartViewModel : ViewModel 
{ 
} 

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

public class TitleContentPartViewModel : TextContentPartViewModel 
{ 
} 

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

私がレンダリングされるContentPartViewModelのコレクションが含まれている包括的なビューモデルを持っています

public class ContentViewModel 
{ 
    public ICollection<ContentPartViewModel> ContentParts { ... } 
} 

私は、コンテンツのすべての部分をレンダリングするContentViewを持っている:

<UserControl ...> 
    <ItemsControl ItemsSource="{Binding ContentParts}"/> 
</UserControl> 

理想的な世界では、各コンテンツパーツタイプに対してDataTemplateを定義するだけで、それに応じてレンダリングされます。ただし、SilverlightはDataTemplateクラスのDataTypeプロパティをサポートしていないため、オプションではありません。

もう1つの方法は、DataTemplateSelectorを入力し、ビューモデルタイプからDataTemplateへのマッピングを行うことです。 SL2のItemsControlにはItemTemplateSelectorプロパティがありません - ItemTemplateプロパティのみがあります。これは、両方の、明らかにかなりひどいです

<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> 

:そのコンテンツの一部に関連する作品とは別に、すべてのUIをオフにするコンバータを使用していますItemTemplateを提供するが、オプションなしで私を残し

パフォーマンスとコードの可読性/正確性のために。また、出力を正しくフォーマットするのがずっと難しくなります。だから、質問:

  1. SL2で誰かがこれを行うより良い方法をお勧めしますか?
  2. SL3で状況が改善したかどうかを誰でも確認できますか?

おかげで、 ケント

+0

それはあなたがより良い感じさせる場合、のModelViewの「ビュー」は実際にあなたのバインディングでの視認性のものが存在することを説明しています。私はしかし、あなたの痛みを感じる(とSL5も待つ) – Vlagged

答えて

1
  1. はい。 DataTemplateのデータ型は、Silverlight 2またはSilverlight 3ではサポートされていません。

  2. SilverlightでItemTemplateSelectorを回避できます。このサンプルを見てください。

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); 
    } 
} 
+0

マイケルに感謝します。すべてのインフラストラクチャを作成し、さまざまなItemsControlsをサブクラス化しなければならないのは理想的ではありませんが、うまくいくはずです。一度試してみると更新されます。 –

+0

サンプルまたはこの質問は、このリンクを除いて実際には完全ではありません。http://forums.silverlight.net/forums/t/79266.aspxこれは、DataTemplateリソースを定義し、プログラムでそれらを参照する方法を示しています。 – xanadont

関連する問題