2013-05-05 24 views
9

Tôi đang tạo ứng dụng Windows Store đầu tiên của mình trong Visual Studio 2012. Tôi có một điều khiển GridView mà tôi đã bật để được sắp xếp lại. Tôi có mã mà tôi cần để chạy khi danh sách được sắp xếp lại. Tôi đã thử sự kiện thả. Nó không cháy. Tôi đã thử một số sự kiện kéo khác, mà cũng không cháy. Nó có vẻ như thế này rất đơn giản ... Cảm ơn thời gian của bạn!XAML/C#: Sự kiện nào xảy ra sau khi sắp xếp lại một GridView?

+1

Bạn có thể sử dụng sự kiện 'CollectionChanged' của 'ObservableCollection ', nếu bạn đã cung cấp 'ItemsSource' của' GridView' với 'ObservableCollection ' – Xyroid

Trả lời

21

Bạn không thể sắp xếp lại một GridView trừ khi ItemsSource là ràng buộc để một ObservableCollectionCanReorderItems, CanDragItems, và AllowDrop được thiết lập để true. Đó là không phải cần thiết để sử dụng số CollectionViewSource để bật sắp xếp lại trong gridview của bạn. Trên thực tế, collectionviewsource thường được sử dụng để nhóm gridview và không thể sắp xếp lại khi dữ liệu được nhóm lại.

Dù sao, XAML của bạn sẽ trông như thế này:

<Grid Background="Black"> 
    <Grid.DataContext> 
     <local:MyModel/> 
    </Grid.DataContext> 
    <GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True" 
       ItemsSource="{Binding Items}"> 
    </GridView> 
</Grid> 

Mặc dù bất kỳ enumerable có thể được ràng buộc với ItemsSource của một GridView nó chỉ là một ObservableCollection cho phép sắp xếp lại. Có, bạn có thể sử dụng loại tùy chỉnh thực hiện sắp xếp lại, nhưng tại sao lại lộn xộn với điều đó khi ObservableCollection thực hiện điều đó cho bạn?

mô hình điểm của bạn có thể trông như thế này:

public class MyModel 
{ 
    public MyModel() 
    { 
     foreach (var item in Enumerable.Range(1, 50)) 
      Items.Add(item); 
     Items.CollectionChanged += Items_CollectionChanged; 
    } 

    ObservableCollection<int> m_Items = new ObservableCollection<int>(); 
    public ObservableCollection<int> Items { get { return m_Items; } } 

    object m_ReorderItem; 
    int m_ReorderIndexFrom; 
    void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     switch (e.Action) 
     { 
      case NotifyCollectionChangedAction.Remove: 
       m_ReorderItem = e.OldItems[0]; 
       m_ReorderIndexFrom = e.OldStartingIndex; 
       break; 
      case NotifyCollectionChangedAction.Add: 
       if (m_ReorderItem == null) 
        return; 
       var _ReorderIndexTo = e.NewStartingIndex; 
       HandleReorder(m_ReorderItem, m_ReorderIndexFrom, _ReorderIndexTo); 
       m_ReorderItem = null; 
       break; 
     } 
    } 

    void HandleReorder(object item, int indexFrom, int indexTo) 
    { 
     Debug.WriteLine("Reorder: {0}, From: {1}, To: {2}", item, indexFrom, indexTo); 
    } 
} 

Trong đoạn mã trên, sắp xếp lại event là không có thật. Nó có nguồn gốc từ sự kết hợp của hành động "Xóa" và hành động "Thêm" trong sự kiện CollectionChanged. Đây là lý do tại sao đây là tuyệt vời. Nếu sắp xếp lại chỉ có sẵn từ GridView thì ViewModel sẽ không thể xử lý được. Vì danh sách cơ bản là cách bạn phát hiện sắp xếp lại, ViewModel được bật.

Mọi trường hợp đều hơi khác nhau. Bạn có thể không quan tâm đến chỉ mục để bạn có thể đơn giản hóa mã. Bạn có thể không cho phép thêm hoặc xóa khỏi bộ sưu tập, do đó bạn chỉ cần theo dõi hành động Thêm. Một lần nữa, nó phụ thuộc vào tình hình của bạn. Mã mẫu của tôi ở trên sẽ nhận được 99% các trường hợp được chăm sóc.

Hãy nhớ rằng, GridView không phải là điều khiển duy nhất cho phép sắp xếp lại. Mọi điều khiển dựa trên ListViewBase (như ListView) hỗ trợ sắp xếp lại - vẫn đang sử dụng ObservableCollection. Nhưng GridView là điều khiển phổ biến nhất để sử dụng tính năng này. Chắc chắn.

tham khảo: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.listviewbase.canreorderitems

Oh, để trả lời câu hỏi của bạn!

Không có sự kiện nào cho biết sắp xếp lại. Sắp xếp lại là hành động có nguồn gốc dựa trên kết hợp các hành động trong sự kiện ObservableCollectionCollectionChanged cơ bản. Có lý?

Bằng cách này, đây là cú pháp mẫu để ràng buộc vào một CollectionViewSource, nếu bạn chọn:

<Grid Background="Black"> 
    <Grid.DataContext> 
     <local:MyModel/> 
    </Grid.DataContext> 
    <Grid.Resources> 
     <CollectionViewSource x:Name="CVS" Source="{Binding Items}" /> 
    </Grid.Resources> 
    <GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True" 
       ItemsSource="{Binding Source={StaticResource CVS}}" > 
    </GridView> 
</Grid> 

Best of luck.

+0

Cảm ơn bạn rất nhiều vì đã giải thích! Rất hữu ích !! –

+0

Bạn đang tìm kiếm câu trả lời cho cả ngày - điều này là hoàn hảo, chỉ là những gì tôi cần. –

+0

@ JerryNixon-MSFT Bên trong sự kiện đã thay đổi 'Items_CollectionChanged', tôi sẽ xử lý __adding__ như thế nào với bộ sưu tập? Bởi vì hiện tại __removing__ theo sau __adding__ sẽ dẫn đến 'HandleReorder()' – lbrahim