Извините, я не хотел быть вечеринкой и не предлагать решения. Но это одно из самых больших препятствий, с которыми я сталкиваюсь при использовании MVVM в Silverlight.
Одна вещь, которую я делал в прошлом, - это использование UserControl с ContentPresenter внутри в качестве ItemsTemplate. (Так много слоев!) В UserControl, когда DataContext изменяется, я бы выбрал шаблон для использования из ресурсов UserControl. (На самом деле шаблоны не обязательно должны находиться внутри UserControl, но мне больше нравится эта инкапсуляция.)
MainPage
<UserControl>
<UserControl.Resources>
<DataTemplate x:key="itemTemplate">
<my:ItemView />
</DataTemplate>
</UserControl.Resources>
<ItemsControl ItemTemplate="{StaticResource itemTemplate}" />
</UserControl>
ItemView.xaml:
<UserControl>
<UserControl.Resources>
<DataTemplate x:Key="Template1">
<!-- Template #1 -->
</DataTemplate>
<DataTemplate x:Key="Template2">
<!-- Template #2 -->
</DataTemplate>
</UserControl.Resources>
<ContentPresenter Name="presenter"
Content="{Binding}" />
</UserControl>
ItemView.xaml.cs
...
OnDataContextChanged(...)
{
var content = this.DataContext as MyDataType;
DataTemplate template;
switch (content.State)
{
case State1:
template = this.Resources["template1"] as DataTemplate;
break;
case State2:
template = this.Resources["template2"] as DataTemplate;
break;
}
this.presenter.ContentTemplate = template;
}
...
И если вы все еще следуете, обратите внимание, что Silverlight также не предоставляет метод OnDataContextChanged, как вы получаете в WPF. Итак, чтобы покрыть это, посмотрите, что Джереми Ликнесс говорит об этом здесь:
http://www.codeproject.com/Articles/38559/Silverlight-DataContext-Changed-Event.aspx
Я использую это довольно часто. Спасибо, Джереми!
Кроме того, есть некоторые довольно серьезные ограничения в этом отношении по сравнению со всей мощью, которую WPF дает вам на этой арене. Например, действительно нет хорошего способа подделать Селектор ItemContainerStyle. (Что я знаю.)