2011-05-24 20 views
7

ViewModel'de ListCollectionView'a bağlı bir ListView Denetimi var.GroupStyles nasıl çalışır?

Bu öğeleri gruplandırmayı denemek istedim, ancak bazı sorunlar yaşadım.

Başlamak için VM'de Özellik gruplamasını ayarlıyorum ve daha sonra bir GroupStyle ekledim.

C#:

ListCollectionView.GroupDescriptions.Add(new PropertyGroupDescription("Category")); 

XAML:

listesi şimdi sadece kategori adları, ürün kendilerini görmek için bir yol yoktur Ancak
<ListView.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=Name}"/> 
      </DataTemplate> 
     </GroupStyle.HeaderTemplate> 
    </GroupStyle> 
</ListView.GroupStyle> 

.

Burada neler olup bittiğini tam olarak anlamıyorum. GroupStyle için bir şablon oluşturduğumda gerçekten neye bağlanıyorum? Name dışında başka özellikleri var mı?

GroupStyle ürününü ekledim, daha önce oluşturduğum bir ListView I'e10 ekledim. GroupStyle ile uğraşmak bir şey mi?

Listedeki öğeler başka bir sınıfa aitse ve ne tür bir sınıfa ait olduklarını (kimliğine sahip) temel alarak gruplamak istemediysem. Daha sonra bu ana sınıftaki grup adını bir özellik olarak alırdım. Mümkün mü?

KISMİ ÇÖZÜM:

Sorun ListView uygulanan stili ile oldu. Tarzın ne anlama geldiği hakkında hiçbir fikrim yok.

Ben true için IsItemsHost seti ile bir Panel kullanmak kalmanın liste ControlTemplate bir ItemsPresenter kullanmıyordum

TAM ÇÖZÜM. GroupPyling'in doğru çalışması için ItemsPresenter kullanılmalıdır.

cevap

16

Hatanız kodunuzun başka bir yerinde olduğunu düşünüyorum.

Genellikle, sizin Görünümünde sizin ViewModel

namespace Derp 
{ 
    public sealed class ViewModel 
    { 
     public ObservableCollection<Model> Items {get;set;} 
     // initialization code not shown 
    } 

    public sealed class Model 
    { 
     public string GroupName {get;set;} 
     public string ModelName {get;set;} 
    } 
} 

üzerinde Modelleri bir koleksiyon ortaya çıkarmak, bu koleksiyona bir CollectionViewSource bağlamak:

<Window.DataContext> 
    <ViewModel xmlns="clr-namespace:Derp" /> 
</Window.DataContext> 
<Window.Resources> 
    <CollectionViewSource 
     Source="{Binding Items}" 
     x:Key="GroupedItems"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription 
       PropertyName="GroupName" /> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

İleri, biz liste denetimimizi bu CollectionViewSource (bir giriş kullanarak Bu örnek):

<ComboBox 
    ItemsSource="{Binding Source={StaticResource GroupedItems}}" 
    DisplayMemberPath="ModelName"> 
    <ComboBox.GroupStyle> 
     <GroupStyle> 
      <GroupStyle.HeaderTemplate> 
       <DataTemplate> 
        <TextBlock 
         Text="{Binding Name}" /> 
       </DataTemplate> 
      </GroupStyle.HeaderTemplate> 
     </GroupStyle> 
    </ComboBox.GroupStyle> 
</ComboBox> 

o kafa karıştırıcı alabilir, üzerinde gruplandırılır Modelleri bir koleksiyon karşı bağlayıcı GroupStyle içinde, kendi Model karşı bağlayıcı değildir, yani (bu durumda) özellik "GrupAdı". CollectionViewSource, Modellerinizin ürününü CollectionViewGroup'u genişleten koleksiyonlara dönüştürür. Bu gruplarda, Modeller öğelerinizin (GroupName özelliğinin değeri) gruplandırıldığı ortak değeri içeren Name adı verilen bir özelliği vardır. Yani, HeaderTemplate'da, CollectionViewGroup.Name'a bağlandınız.

+1

Sanal Makinede bir ListCollectionView sınıfına sarılmış Öğelerim olması dışında, hemen hemen aynı koda sahibim. Sorun şu ki, işe yarayacak, ancak sadece içerdiği öğeler değil, sadece grupları gösteriyor. Varsayılan olarak nasıl görünmelidir? Bir genişletici mi yoksa sadece bir başlık mı olmalı? –

+0

@ IngóVals: Öncelikle, VM'nizde CollectionViewSource'un bulunmasıyla hangi yan etkilerin ortaya çıktığından tam olarak emin değilim; Örnekte olduğu gibi hareket ettirmeyi deneyin ve bunu sanal makinenizdeki bir ObservableCollection ile değiştirin. Yapmanız gereken bir sonraki şey detabinding için hata ayıklama mesajlarını açmaktır: http://i.imgur.com/UAxJO.png Ardından, çıkış penceresini tekrar çalıştırın ve kontrol edin ve hangi hataların olduğunu görün. – Will

+0

@Will: CollectionViewSource ürününün dışarıda bir şey değiştirmemesi, değiştirmeyi denesem bile aynı şeydir. Ayrıca sorun bağlayıcı değildir, bağlayıcı hata veya uyarı yoktur. Her şeyi doğru yapıyor gibi görünüyor. Kategoriler ve hepsinin doğru isimlerini gösteriyor. Bu bir çeşit şablon/görüntüleme problemi, gruplandırmaya sahip bir listenin görüntülendiği varsayılan yöntem nedir? HeaderTemplate verilerle ilgili olarak nerede görünür? –