Tworzę swoją pierwszą aplikację Windows Store w Visual Studio 2012. Mam kontrolę gridview, którą umożliwiłem zmianę kolejności. Mam kod, który muszę uruchomić po zmianie kolejności list. Próbowałem zdarzenia Drop. Nie strzela. Wypróbowałem kilka innych zdarzeń przeciągania, które również nie wystrzeliły. Wygląda na to, że powinno być tak proste ... Dziękuję za poświęcony czas!XAML/C# Jakie zdarzenie zostanie wywołane po zmianie kolejności widoku siatki?
Odpowiedz
Nie można zmienić kolejność GridView
ile ItemsSource
jest związany z ObservableCollection
i CanReorderItems
, CanDragItems
i AllowDrop
są ustawione na true
. Jest nie konieczne, aby użyć CollectionViewSource
, aby umożliwić zmianę kolejności w swoim gridview
. W rzeczywistości, do grupowania collectionviewsource
jest często używany gridview
, a zmiana kolejności nie jest możliwa, gdy dane są pogrupowane.
Zresztą Twój XAML będzie wyglądać następująco:
<Grid Background="Black">
<Grid.DataContext>
<local:MyModel/>
</Grid.DataContext>
<GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
ItemsSource="{Binding Items}">
</GridView>
</Grid>
Chociaż każdej enumerable
może być związany z ItemsSource
z GridView
jest to tylko ObservableCollection
które pozwala kolejność. Tak, możesz użyć niestandardowego typu, który implementuje zmianę kolejności, ale po co to robić, gdy ObservableCollection
robi to za Ciebie?
Państwa zdanie wzór może wyglądać następująco:
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);
}
}
W kodzie powyżej, Reorder event
nie jest prawdziwe. Pochodzi z kombinacji akcji "Usuń" i akcji "Dodaj" w wydarzeniu CollectionChanged
. Oto dlaczego jest to niesamowite. Jeśli zmiana kolejności była dostępna tylko z poziomu GridView
, wówczas ViewModel
nie byłby w stanie jej obsłużyć. Ponieważ podstawową listą jest sposób wykrywania zmiany kolejności, włączono opcję ViewModel
.
Każdy przypadek jest nieco inny. Możesz nie dbać o indeks, aby uprościć kod. Nie możesz pozwolić na dodawanie lub usuwanie z kolekcji, więc musisz tylko monitorować akcję Dodaj. Ponownie, zależy to od twojej sytuacji. Mój przykładowy kod powyżej powinien otrzymać 99% rozpatrywanych spraw.
Pamiętaj, że GridView
to nie jedyna kontrola, która umożliwia zmianę kolejności. Jakakolwiek kontrola oparta na ListViewBase
(podobnie jak ListView
) obsługuje zmianę kolejności - nadal używa się ObservableCollection
. Ale GridView
jest najczęstszą formantem do korzystania z tej funkcji. Na pewno.
referencyjny: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.listviewbase.canreorderitems
Och, aby odpowiedzieć na to pytanie!
Brak zdarzeń wskazujących na zmianę kolejności. Ponowna kolejność jest operacją wyprowadzoną w oparciu o kombinację działań w zdarzeniu ObservableCollection
CollectionChanged
. Ma sens?
Przy okazji, oto próbka składnia do wiązania z CollectionViewSource
, jeśli zdecydujesz się:
<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>
Powodzenia.
Dziękuję bardzo za wyjaśnienie! Bardzo pomocne!! –
Szukałem odpowiedzi na to przez cały dzień - to jest idealne, właśnie to, czego potrzebowałem. –
@ JerryNixon-MSFT Wewnątrz zdarzenia "Items_CollectionChanged" zmieniono, w jaki sposób obsługiwać __adding__ do kolekcji? Ponieważ obecnie __removing__ po __adding__ spowodowałoby 'HandleReorder()' – lbrahim
- 1. Po zmianie widoku QML kliknij
- 2. Czy jest jakieś zdarzenie, które zostanie wywołane po zakończeniu animacji WPF?
- 3. Zdarzenie dwukrotne kliknięcie komórki w widoku siatki danych
- 4. Jakie wydarzenie zostało wywołane po pełnym wyświetleniu wszystkich widoków?
- 5. wyzwolić zdarzenie po określonej kolejności kliknięć
- 6. Ponowne ładowanie niestandardowego UITableViewCell po zmianie kolejności komórek
- 7. Szerokość widoku siatki widoku
- 8. Android - Czy zdarzenie zostało wywołane po zakończeniu renderowania elementu activity.setContentView?
- 9. Działanie iOS11 UIBarButtonItem nie zostanie wywołane
- 10. Błąd przesyłania pliku Chrome: po zmianie zdarzenie nie zostanie wykonane dwukrotnie z tym samym plikiem
- 11. Zdarzenie onload SVG zostało wywołane zbyt wcześnie?
- 12. Zdarzenie zmiany wyboru wiersza siatki Kendo?
- 13. Wyświetlenie widoku siatki grid.NET ASP.NET
- 14. Jak automatycznie zmienić rozmiar siatki po zmianie rozmiaru formularza?
- 15. Czy komponenty siatki mogące wyświetlać ramkę rodzica po zmianie rozmiaru?
- 16. Testowanie, czy zdarzenie zostało wywołane w Jasmine
- 17. Sortowanie siatki Kendo w kolejności sortowania
- 18. Jak ponownie załadować stronę po zmianie orientacji?
- 19. Czy <span> zostanie automatycznie usunięty po zmianie innerHTML?
- 20. Czy istnieje zdarzenie Delphi, które gwarantuje, że zostanie wywołane, gdy aplikacja zostanie zakończona, ale zanim jakiekolwiek formularze zostaną zniszczone?
- 21. Jakie zdarzenie występuje natychmiast po wyświetleniu kontrolki po raz pierwszy?
- 22. W języku javascript, jak wywołać zdarzenie po zmianie wartości zmiennej?
- 23. Przechodzenie z widoku listy do widoku siatki
- 24. Prawidłowy sposób unieważnienia układu widoku kolekcji po zmianie rozmiaru
- 25. oddzwaniania przed widoku kalendarza zostanie zmieniony
- 26. UINavigationBar tytuł zostanie obcięty przy zmianie viewControllers
- 27. Zdarzenie po zainstalowaniu aplikacji (Android)
- 28. Zapobieganie zmianie kolejności w wyjściach pochodnych?
- 29. Pokazuję liczbę z 2 miejsc po przecinku w widoku siatki
- 30. Aktualizowanie widoku siatki Dynamicznie po usunięciu elementu (pliku)
Można użyć 'zdarzenie CollectionChanged' z' 'ObservableCollection, jeśli podałeś' ItemsSource' od '' GridView' z ObservableCollection ' –
Xyroid