Ответ 1
Silverlight не содержит DataTemplateSelector, который используется для выбора шаблона данных на основе связанного с данными элемента и объект данных. Но, нетрудно построить свой собственный.
Начните с класса, который наследует от System.Windows.Controls.ContentControl. Этот класс имеет свойство для шаблона данных и свойство для контента, к которому вы можете использовать привязку. Создайте переопределение в методе OnContentChanged, подобном этому
protected override void OnContentChanged(object oldContent, object newContent)
{
}
Я предпочитаю размещать шаблоны в отдельном словаре, на всякий случай, когда мне нужно поделиться ими между проектами. В этом методе задайте шаблон этого элемента управления шаблону, выбранному из словаря. Что-то вроде:
Switch(DataStatus){
case 0: ContentTemplate = LoadFromDictionary(
"DataTemplateDemo;component/DataTemplates.xaml",
"Status0Template");
break;
case 1: ContentTemplate = LoadFromDictionary(
"DataTemplateDemo;component/DataTemplates.xaml",
"Status1Template");
break;
//etc
}
в этом случае должно быть имя словаря DataTemplates.xaml с паролем шаблонов данных.
В вашем файле xaml используйте класс выбора шаблона в качестве шаблона списка:
<ListBox x:Name="AnInterrestingList">
<ListBox.ItemTemplate>
<DataTemplate>
<DataTemplateDemo:DateTemplateSelector Content="{Binding}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Я использую этот вспомогательный метод, как показано ниже, для возврата шаблонов из словарей:
public static DataTemplate LoadFromDictionary(string dictionary,
string template)
{
var doc = XDocument.Load(dictionary);
var dict = (ResourceDictionary)XamlReader
.Load(doc.ToString(SaveOptions.None));
return dict[template] as DataTemplate;
}
Обновление
Тем временем я написал блогпост с образцом кода по этому вопросу. Он доступен на мой блог.