フォーマットされたコンテンツを表すビューモデルの階層があります。
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 { ... }
}
次にContentView
、コンテンツのすべての部分をレンダリングするがあります。
<UserControl ...>
<ItemsControl ItemsSource="{Binding ContentParts}"/>
</UserControl>
理想的な世界でDataTemplate
は、コンテンツパーツタイプごとにを定義するだけで、それに応じてレンダリングされます。ただし、SilverlightはクラスのDataType
プロパティをサポートしていないためDataTemplate
、これはオプションではありません。
別のオプションは、を提供し、DataTemplateSelector
ビューモデルタイプからDataTemplate
自分自身へのマッピングを行うことです。残念ながらItemsControl
、SL2にはプロパティがなく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で状況が改善したかどうかを誰かが確認できますか?
ありがとう、ケント