2014-12-24 10 views
5

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 ScrollViewerContentTemplateSelector, 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.

+0

Greifen Sie jemals Select Methode? –

+0

@eranotzap: Nein, es wird nie für 'ScrollViewer' gefeuert. – Dennis

+1

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. –

Antwort

1

Ich habe die Syntax nicht getestet. Wenn es falsch ist, lassen Sie mich einfach wissen und ich werde löschen
Dies ist, was würde ich versuchen,

<ScrollViewer Grid.Row="1"> 
    <ContentControl Content="{Binding SelectedItem, ElementName=ListBox}"      
        ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}"/> 
</ScrollViewer> 
+0

Entschuldigung, aber ich interessiere mich nicht für die Problemumgehung. Die Frage bezog sich genau auf das Verhalten von ScrollViewer: Vielleicht gibt es einige Funktionen oder Fehler, mit denen ich nicht vertraut bin. Da ich die gleiche Problemumgehung benutze, die Sie gepostet haben, werde ich Ihre Antwort abstimmen. – Dennis

+0

Gibt es negative Auswirkungen auf die Problemumgehung? – Paparazzi

1

Dies sollte den Trick:

<ScrollViewer Grid.Row="1"> 
     <ContentPresenter Content="{Binding SelectedItem, ElementName=ListBox}" ContentTemplateSelector="{StaticResource ViewModelTemplateSelectorKey}" /> 
    </ScrollViewer> 
+0

(plus eins), ich mag diese Antwort, ich muss diese Annahme überprüfen, aber ich bellive ScrollViewer wird wissen, dass es eigenen ContentPresenter (d. H. Die ScrollContentPresenter) Und verwenden Sie die, die Sie es deklarativ wie Sie getan haben. –