2010-10-01 14 views
7

Öğeleri belirli bir biçimde oluşturmak için bir ItemsControl içinde bir ItemTemplate'i kullanabiliyorum. Ancak, ItemsControl içindeki öğelerden biri, TextBox, ItemsTemplate'ın bir örneğinden ziyade işlenen bir TextBox olur. Anlatabildiğim kadarıyla, bu herhangi bir FrameworkElement için geçerlidir. Bir ItemsControl için amaçlanan bu davranış mı yoksa yanlış bir şey mi yapıyorum?Neden ItemsControl My ItemTemplate Kullanmıyor mu?

Bir örnek:

<ItemsControl> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid Margin="5"> 
     <Rectangle Fill="Blue" Height="20" Width="20" /> 
     </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.Items> 
    <sys:Object /> 
    <TextBox /> 
    <sys:Object /> 
    <Rectangle Fill="Red" Height="20" Width="20" /> 
    </ItemsControl.Items> 
</ItemsControl> 

Bu dört mavi dikdörtgenler görüntülemek için bekliyordu. Koleksiyondaki her öğenin bir ItemTemplate öğesi tanımlandığı zaman, şablonun bir örneği olarak işlendiğini düşündüm. Ancak, bu durumda, aşağıdakiler oluşturulur: mavi bir dikdörtgen ve ardından bir TextBox ve ardından mavi bir dikdörtgen ve ardından kırmızı bir dikdörtgen gelir.

+0

Ben bu davranışı yönelik olduğunu tahmin ediyorum ve bir Geliştiricilere özel bir kerelik kullanım kontrolleri ekleme olanağı sağlaması amaçlanmıştır. Örneğin, bu seçimi temizlemek için bir ComboBox bir Düğme eklemek için kullanabilir veya ItemsSource tarafından belirtilen koleksiyonu filtreleyen bir ListBox bir TextBox koyabilirsiniz. Birinin bu davranış için resmî bir cevabı olduğunu duymak isterim çünkü bir ItemTemplate kullanımı için karşı sezgisel olarak buldum. – Drew

+0

Anthony tarafından büyük bir soru ve harika cevap, teşekkürler çocuklar. – Golvellius

cevap

12

ItemsControl ürün toplama bir nesne geçirilir ve bu nesne oluşturulmuş bir kabın olmayan ürün panele doğrudan ilave edilebilir (ve böylece şablon bir) halinde true döner korunan bir elemanı IsItemItsOwnContainerOverride sahiptir.

Temel uygulama, UIElement'dan türetilen herhangi bir nesne için true değerini döndürür. Bu davranışı elde etmek için ItemsControl'dan miras almanız ve bu yöntemi geçersiz kılmanız ve her zaman false döndürmeniz gerekir. Ne yazık ki bu meselenin sonu değil. PrepareContainerForItemOverride varsayılan uygulaması hala öğe bir UIElement böylece siz de bu yöntemi geçersiz gerekir ise kaba ItemTemplate atamaz: -

protected override bool IsItemItsOwnContainerOverride(object item) 
    { 
     return false; 
    } 


    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     base.PrepareContainerForItemOverride(element, item); 
     ((ContentPresenter)element).ContentTemplate = ItemTemplate; 
    } 
+1

2015 itibariyle, ikinci parçayı sabitlemiş olabilirler. .NET 4.5.1'de WPF ile, 'IsItemItsOwnContainerOverride 'için' false' döndürürsem, şablon madde kümesinde ayarlanır. –

2

Burada sadece spekülasyon yapıyorum, ama bunun, ItemContainerGenerator'un içinde yaşayan bir davranış olduğunu iddia ediyorum. ItemContainerGenerator bir öğeye baktığını iddia ediyorum ve eğer UIElement diyorsa, "serin, madde muhafazası oluşturuldu, ben sadece döndüreceğim" diyor ve değilse, diyor ki, "Daha iyi üreteceğim Bu ürün için bir konteyner var. DataTemplate nerede? "

İlgili konular