2010-10-04 55 views
12

Tôi đang cố triển khai ứng dụng WPF đầu tiên của mình bằng cách sử dụng mẫu thiết kế MVVM.WPF4 DataGrid không sắp xếp theo tiêu đề cột

Tôi đã tạo một ứng dụng được kết nối với ObservableCollection <>. Ứng dụng hiển thị tốt, nhưng tôi hy vọng DataGrid sắp xếp lại các hàng khi tôi nhấp vào các tiêu đề cột.

Tôi đã nghiên cứu các bài đăng cho biết: Nguồn dữ liệu phải triển khai IEnumerable, của tôi. Tôi cần phải đặt CanUserSortColumns và/hoặc CanUserSort (trên mỗi cột), tôi đã làm. Tôi có thể thực hiện sắp xếp tùy chỉnh bằng cách chỉ định chức năng gọi lại Sắp xếp, tôi đã làm.

Không có cách nào trong số này có vẻ hữu ích. Trong trình gỡ rối, hàm _customerGrid_Sorting của tôi không bao giờ được gọi và nhấp vào các tiêu đề cột không có hiệu lực.

Tôi có thiếu thứ gì đó trong XAML tiếp theo không? Có giao diện nào khác tôi cần triển khai không? Tôi cảm thấy rất mất ngay bây giờ, vì vậy bất kỳ trợ giúp được đánh giá cao.

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> 

Trả lời

23

Vấn đề là mã này

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

Giá trị mặc định sắp xếp các công trình như đã nêu ở khắp mọi nơi chỉ dành cho DataGridTextColumn, DataGridComboBoxColumn, vv.

Bây giờ ở đây lưới điện không biết cách sắp xếp vì bạn đã xác định một DataTemplate và một Nhãn bên trong nó. Một số người khác có thể đã định nghĩa một SstackTemplate, vv bên trong DataTemplate. Vì vậy, DataGrid sẽ không biết cách sắp xếp nó.

Tôi sẽ cố gắng gửi cho bạn một mã mẫu rất sớm như những gì chúng tôi có thể làm cho DataGridTemplateColumn như vậy. Nhưng hy vọng hướng tôi đã cho bạn giúp !!


Có vẻ câu trả lời rất đơn giản. Tôi đã thử nó với một DataGrid mẫu sử dụng MVVM nhưng giải pháp của tôi nên làm việc cho bạn tôi cảm thấy

Mọi việc đã ổn ở bên dưới DataGridTemplateColumn nhưng bạn đang thiếu một thuộc tính rất quan trọng gọi là SortMemberPath. Thw WPF nên biết về tài sản cần phân loại.

Người gốc mà bạn đăng vẻ như thế này

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


Tôi không biết cấu trúc dữ liệu của bạn. Nhưng hình đã sửa đổi sẽ trông giống như thế này

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

Tôi hy vọng nó sẽ giúp bạn !! Hãy cho tôi biết nếu nó không giúp bạn, tôi sẽ cố gắng gửi ứng dụng của tôi trong một số blog (tôi lười biếng để làm điều đó mặc dù !!)

+0

Cảm ơn Guru, giúp một chút. Ít nhất tôi biết lý do tại sao hành vi sắp xếp mặc định không hoạt động.Tôi lấy nó có nghĩa là tôi cần phải thực hiện một loại tùy chỉnh. Mà tôi nghĩ rằng tôi có thể làm bằng cách xác định một handler trong thuộc tính Sorting của DataGrid. Nhưng người xử lý của tôi không bắn. Tôi mong nhận được mẫu mã của bạn để cung cấp cho tôi nhiều hướng hơn. –

+1

@Paul - Tôi nghĩ bạn chỉ thiếu một thuộc tính có tên là "SortMemberPath". Hy vọng nó giúp!! – GuruC

+0

Câu trả lời tuyệt vời Guru! Cảm ơn sự giúp đỡ của bạn! Tôi sẽ thêm rằng bằng cách chỉ định các SortMemberPath = "CustID" (ví dụ) trên DataGridTemplateColumn, tôi đã có thể loại bỏ các thuộc tính Sorting trên DataGrid và loại bỏ thực hiện tùy chỉnh của tôi của IComparer. Tôi câu trả lời của bạn sẽ giúp người khác. Nếu có ai thắc mắc về giải pháp, tôi sẽ cố gắng giúp họ. –

0

Hãy thử điều này một: 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

Câu trả lời của bạn khác với câu trả lời được chấp nhận như thế nào? Giá trị của SortMemberPath nên đặt tên cho một cột của nguồn dữ liệu. "Hoàn thành" không phải là một trong các cột thành viên của tôi. –

+0

Tôi không thấy câu trả lời ở trên, có thể được anh ấy/cô ấy đăng trong khi tôi đang chỉnh sửa của tôi. Về tên tiêu đề, tôi đã thử nó kiểm tra wpf của tôi, nếu nó làm việc bạn cần chỉ để thay đổi tên tiêu đề. – Doro

Các vấn đề liên quan