2014-12-24 15 views
5

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.

+0

Hiç SelectTemplate yöntemini ulaşmak musunuz? –

+0

@eranotzap: Hayır, ScrollViewer için hiçbir zaman kovulmuyor. – Dennis

+1

ScrollViewer bir ScrollContentPresenter'ı kullanarak, bir ContentControl altında doğrudan oluşturulduğu gibi verilen ContentTemplate'i uygulayamadığını tahmin ediyorum. –

cevap

1

Sözdizimini test etmedim. Yanlış ise sadece bana bildirin ve ben bu ben

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

Üzgünüm, ama geçici çözüm hakkında ilginç değilim. Soru tam olarak ScrollViewer'ın davranışıyla ilgiliydı: aşina olmadığım bazı özellikler veya hatalar olabilir. Gönderdiğim aynı çözümü kullandığım için, cevabınızı oylayabilirim. – Dennis

+0

Geçici çözüm için herhangi bir olumsuz etkisi var mı? – Paparazzi

1

Bu hile yapmak gerekir denemek olacaktınız
silecektir:

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

(artı bir), bu cevabı beğeniyorum, bu varsayımı kontrol etmeliyim, fakat ben ScrollViewer'ın kendi ContentPresenter'ı (yani ScrollContentPresenter) görmezden geleceğini bilmesi ve bunu sizin deklarasyonla yaptığınız gibi kullanın. –

İlgili konular