ScrollViewer
kullanarak sorunu yaşadım.
İşte örnek görünüm modeller:ScrollViewer, ContentTemplateSelector öğesini yoksayar.
public class A
{
public string Text { get; set; }
}
public class B
{
public int Number { get; set; }
}
... ve DataTemplateSelector
:
public class ViewModelTemplateSelector : DataTemplateSelector
{
public DataTemplate ATemplate { get; set; }
public DataTemplate BTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is A)
return ATemplate;
if (item is B)
return BTemplate;
return base.SelectTemplate(item, container);
}
}
XAML:
<Grid>
<Grid.Resources>
<local:ViewModelTemplateSelector x:Key="ViewModelTemplateSelectorKey">
<local:ViewModelTemplateSelector.ATemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"/>
</DataTemplate>
</local:ViewModelTemplateSelector.ATemplate>
<local:ViewModelTemplateSelector.BTemplate>
<DataTemplate>
<TextBox Text="{Binding Number}"/>
</DataTemplate>
</local:ViewModelTemplateSelector.BTemplate>
</local:ViewModelTemplateSelector>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ListBox x:Name="ListBox" ItemsSource="{Binding}"/>
<ScrollViewer Grid.Row="1" Content="{Binding SelectedItem, ElementName=ListBox}"
ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}"/>
<ContentControl Grid.Row="2" Content="{Binding SelectedItem, ElementName=ListBox}"
ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}"/>
</Grid>
Bu, herhangi bir öğe ListBox
seçildiğinde, ne olup bittiğini olduğunu :
değil iken
Gördüğünüz gibi, ScrollViewer
, ContentTemplateSelector
yok sayar. ScrollViewer
, ContentControl
'dan devralınmıştır ve ilk bakışta, böyle bir davranışa gerek yoktur.
A
ve B
için örtük veri şablonları bildirirseniz, ScrollViewer
bunları doğru şekilde işleyeceğini biliyorum, ancak bu benim gerçek uygulama için bir seçenek değil.
Bu bilinen hata mı? Yoksa bir şey mi özlüyorum?
UPD.
MS Connect'te bir issue gönderdim.
Hiç SelectTemplate yöntemini ulaşmak musunuz? –
@eranotzap: Hayır, ScrollViewer için hiçbir zaman kovulmuyor. – Dennis
ScrollViewer bir ScrollContentPresenter'ı kullanarak, bir ContentControl altında doğrudan oluşturulduğu gibi verilen ContentTemplate'i uygulayamadığını tahmin ediyorum. –