2016-01-21 14 views
8

Uzun bir zaman önce küçük bir WPF programlama yaptım, ama UWP ile xaml'e dönüyorum, fakat bunun neden işe yaradığını ve nedenini anlayamadığını düşünüyorum. Temel olarak bir ListControl kullanmak yerine bir ItemsControl kullanmak istiyorum (çünkü sadece bazı verileri listelemek istiyorum, seçim yapmak istemiyorum). İşte ItemsControl ve ÖğeTemplateSelector Windows 10 UWP uygulaması

<Page.Resources> 
    <DataTemplate x:Key="SentMessageDataTemplate"> 
     <TextBlock Text="Sent" /> 
    </DataTemplate> 
    <DataTemplate x:Key="ReceivedMessageDataTemplate"> 
     <TextBlock Text="Recieved" /> 
    </DataTemplate> 
    <services:MessageDataTemplateSelector x:Key="MessageDataTemplateSelector" ReceivedTemplate="{StaticResource ReceivedMessageDataTemplate}" SentTemplate="{StaticResource SentMessageDataTemplate}"></services:MessageDataTemplateSelector> 
</Page.Resources> 

benim ItemsControl geçerli:: İşte
<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" /> 

benim DataTemplateSelector edilir: İşte benim kaynaklardır

public class MessageDataTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate SentTemplate 
    { 
     get; 
     set; 
    } 

    public DataTemplate ReceivedTemplate 
    { 
     get; 
     set; 
    } 

    protected override DataTemplate SelectTemplateCore(object item) 
    { 
     var message = item as MessageViewModel; 
     if (message == null) 
     { 
      return this.SentTemplate; 
     } 

     return message.Sent ? this.SentTemplate : this.ReceivedTemplate; 
    } 
} 

yerine benim şablonlarından herhangi görüntülendiği bu sadece benim ViewModel tipi adını görüntüler (yani temelde ToString).

Ancak bunu ItemsControl'den ListView'e değiştirirseniz, iyi çalışır.

Herhangi bir öneriniz var mı?

+0

Son zamanlarda yaptığım uygulamalardan birinde aynı sorunla karşılaştım! Bu çözülebilir ise merak ediyorum ... – Depechie

cevap

9

Kullanım:

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 

Bu çağrılan kimse, 2 parametre olmadan biridir.

+0

Bunu denedim, şans yok.ItemsPanelTemplate, varsayılan şablonla aynıdır. Bu bir ItemTemplate ayarladığınızda iyi çalışıyor, sadece ItemTemplateSelectors gibi değil. – Cleverguy25

+0

Cevabımı güncelledim. 1 param ile geçersiz kılma asla (gözlemlediğiniz gibi) aranmaz. Mevcut 2 tane var. Zor. –

0

Belki de <TextBlock Text="{Binding Sent}" /> 'u kullanmalısınız. Şablonunuzda hiçbir şey bağlamazsınız. Bu geçersiz kılma yerine

+0

Bir şey bağlasa bile, işe yaramıyor. ListView hiçbir şey bağlamadan bile çalışır. DataTemplateSelector'da bir kesme noktası ayarlarsam, ItemsControl'de çalışırken asla çağrılmaz. Bence bu sadece bir böcek. – Cleverguy25

5

İlginç - ListView ve GridView her ikisi de şablon seçicisini çağırır; düz ItemsControl veya ListBox yok. Şablon seçicisi içinde diğer SelectTemplateCore yöntemini geçersiz kılma

, yardımcı ör .:

Sonraki yöntem her durumda denir
protected override DataTemplate SelectTemplateCore(object item) 
{ 
    var message = item as MessageViewModel; 
    if (message == null) 
    { 
     return SentTemplate; 
    } 

    return message.Sent ? SentTemplate : ReceivedTemplate; 
} 

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
{ 
    return SelectTemplateCore(item); 
} 

; İlk ItemsControl ürün için çağrılmamıştır. This page türlü bir açıklama sağlamaktadır:

Eğer senin ItemsControl.ItemsPanelSelectTemplateCore(Object) yöntemi için geçersiz kılma sağlamak, bir ItemsStackPanel veya ItemsWrapGrid olduğunu. ItemsPanel, VirtualizingStackPanel veya WrapGrid gibi farklı bir panelse, SelectTemplateCore(Object, DependencyObject) yöntemi için bir geçersiz kılma sağlar. İşte

+0

Kory, sizi birkaç dakikayla dövdü, ancak belgelerinizin bağlantısı yararlı oldu. – Cleverguy25

0

belgelerine diyor:

sizin ItemsControl.ItemsPanel bir ItemsStackPanel veya ItemsWrapGrid ise

Açıklamalar, SelectTemplateCore (Object) yöntemi için geçersiz kılma sağlar. ItemsPanel, VirtualizingStackPanel veya WrapGrid gibi farklı bir panelse, SelectTemplateCore (Object, DependencyObject) yöntemi için bir geçersiz kılma sağlar.