У меня есть иерархия моделей представлений, представляющих форматированный контент:
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
, который затем использует конвертер для отключения всего пользовательского интерфейса, кроме части, относящейся к этой части контента:
<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?
Спасибо,
Kent