Ich habe mit Problem konfrontiert, mit ScrollViewer
.
Hier Musteransicht Modelle:ScrollViewer ignoriert ContentTemplateSelector
public class A
{
public string Text { get; set; }
}
public class B
{
public int Number { get; set; }
}
... und 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>
Dies ist, was los ist, wenn ein Artikel in ListBox
ausgewählt :
Wie Sie sehen können, ignoriert ScrollViewer
ContentTemplateSelector
, nicht. ScrollViewer
ist von ContentControl
geerbt, und auf den ersten Blick gibt es keinen Grund für ein solches Verhalten.
Ich weiß, dass, wenn ich implizite Datenvorlagen für A
und B
, ScrollViewer
werde sie korrekt behandeln, aber dies ist keine Option für meine echte Anwendung.
Ist dieser bekannte Fehler? Oder fehlt mir etwas?
UPD.
Ich habe eine issue auf MS Connect eingereicht.
Greifen Sie jemals Select Methode? –
@eranotzap: Nein, es wird nie für 'ScrollViewer' gefeuert. – Dennis
ScrollViewer benutze einen ScrollContentPresenter, um seinen Inhalt zu rendern. Ich schätze, er wendet das angegebene ContentTemplate nicht an, wie wenn es direkt unter einem ContentControl gerendert wird. –