2010-10-04 30 views
12

Bir MVVM tasarım deseni kullanarak ilk WPF uygulamamı uygulamaya çalışıyorum.WPF4 Datagrid sütun başlıkları üzerinde sıralanmaz

ObservableCollection <> 'a bağlanan bir uygulama oluşturdum. Uygulama iyi sonuç veriyor, ancak sütun başlıklarını tıklattığımda datagrid'in satırları yeniden sıralamasını bekliyorum.

Belirtilen gönderileri araştırdım: Veri kaynağı IEnumerable uygulamak zorundadır, benimki. CanUserSortColumns ve/veya CanUserSort (her sütun) ayarlamak gerekir, ben yaptım. Sıralama geri çağırma işlevini belirterek özel bir sıralama uygulayabilirim.

Bunların hiçbiri yardımcı olmadı. Hata ayıklayıcısında, _customerGrid_Sorting işlevim asla çağrılmaz ve sütun başlıklarını tıklatmanın hiçbir etkisi olmaz.

Aşağıdaki XAML'de bir şey eksik mi? Uygulamam gereken başka bir arayüz var mı? Şu an çok kayıp hissediyorum, bu yüzden herhangi bir yardım takdir edilmektedir.

XAML:

 <DataGrid Name="_customerGrid" 
      AutoGenerateColumns="False" 
      CanUserSortColumns="True" 
      ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
      HorizontalAlignment="Left" 
      ItemsSource="{Binding Path=AllCustomers}" 
      RowDetailsVisibilityMode="VisibleWhenSelected" 
      RowStyle="{StaticResource DataGridRowStyle}" 
      SelectionUnit="FullRow" 
      Sorting="_customerGrid_Sorting" 
      VerticalAlignment="Top"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding Path=CustID}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding Path=Name}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

cevap

23

sorun bu kod

<DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=CustID}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

sadece vb DataGridTextColumn, DataGridComboBoxColumn, her yerde belirtildiği gibi eserler tasnif varsayılan değerdir.

Şimdi burada ızgara nasıl sıralanacağını bilmiyor, çünkü içinde bir DataTemplate ve bir Etiket tanımladınız. Başka bir kişi DataTemplate içinde bir SstackTemplate, vb tanımlayabilir. Yani DataGrid bunu nasıl sıralayacağını bilmeyecek.

Böyle bir DataGridTemplateColumn için yapabileceğimiz en kısa sürede size örnek kod göndermeye çalışacağım. Ama umarım verdiğim yön sana yardım eder!


Yanıtın çok basit olduğu gözüküyor. Ben MVVM kullanarak bir örnek DataGrid ile denedim ama benim çözüm i

Herşey DataGridTemplateColumn altında ince hissediyorum ama SortMemberPath denilen çok önemli bir özelliği eksik sizin için çalışması gerekir. WPF, hangi malın sıralanması gerektiğini bilmelidir.

Eğer senin veri yapılarını bilmiyorum bu

<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 


gibi görünüyor yayınlanmıştır özgün bir. Ancak değiştirilmiş olan kişi bu gibi görünmelidir. Umarım size yardımcı olur !! (Gerçi bunu yapmak için tembelim !!) Bazı blog başvurumu göndermek için çalışacağız, size yardımcı olmaz bana bildirin

+0

Teşekkürler Guru, biraz yardımcı olur. En azından varsayılan sıralama davranışının neden çalışmadığını biliyorum.Anladığım kadarıyla özel bir sıralama yapmam gerekiyor. DataGrid'in Sıralama özniteliğinde bir işleyici belirterek yapabileceğimi düşündüm. Ama işleyicim ateş etmiyor. Daha fazla yön vermek için kod örneğini almayı dört gözle bekliyorum. –

+1

@Paul - "SortMemberPath" adlı bir özniteliği kaçırdığınızı düşünüyorum. Umarım yardımcı olur!! – GuruC

+0

Harika cevap Guru! Yardımın için teşekkürler! DataGridTemplateColumn üzerinde SortMemberPath = "CustID" (örneğin) belirterek bunu ekleyeceğim, DataGrid'teki Sıralama özniteliğini ortadan kaldırarak ve özel IComparer uygulamamı kaldırabildim. Senin cevabın başkalarına yardım ediyorum. Herhangi birinin çözümü hakkında soruları varsa, onlara yardım etmeye çalışacağım. –

0

bu bir deneyin: SortMemberPath = "Complete"

<DataGridTemplateColumn Header="CustID" SortMemberPath="Complete" MinWidth="90"  
CanUserSort="True" CanUserResize="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=CustID}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

Cevabınız kabul edilen cevaptan farklı mıdır? SortMemberPath değeri, veri kaynağının bir sütununu belirtmelidir. "Tamamlandı" üye sütunlarımdan biri değil. –

+0

Yukarıdaki cevabı görmedim, benim düzenlerken yazı yazmış olabilir. Üstbilgi adıyla ilgili olarak, wpf testimi denedim, eğer işe yararsa sadece başlık adını değiştirmeye ihtiyacınız var. – Doro

İlgili konular