で表示モデルの異種コレクションをレンダリング:私はフォーマットされたコンテンツを表すビューモデルの階層構造を持っているの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
を提供するが、オプションなしで私を残し
パフォーマンスとコードの可読性/正確性のために。また、出力を正しくフォーマットするのがずっと難しくなります。だから、質問:
- SL2で誰かがこれを行うより良い方法をお勧めしますか?
- SL3で状況が改善したかどうかを誰でも確認できますか?
おかげで、 ケント
それはあなたがより良い感じさせる場合、のModelViewの「ビュー」は実際にあなたのバインディングでの視認性のものが存在することを説明しています。私はしかし、あなたの痛みを感じる(とSL5も待つ) – Vlagged