我正在 Visual Studios 2012 中制作我的第一个 Windows 应用商店应用程序。我有一个已启用重新排序的 gridview 控件。我有在重新排序列表时需要运行的代码。我已经尝试过 Drop 事件。它不火。我尝试了其他几个拖动事件,也没有触发。看起来这应该很简单......感谢您的时间!
1 回答
GridView
除非aItemsSource
绑定到ObservableCollection
and CanReorderItems
,否则不能重新排序 a CanDragItems
,并且AllowDrop
设置为true
。不必使用 a来CollectionViewSource
启用您的gridview
. 实际上,acollectionviewsource
经常用于对 a 进行分组,gridview
并且在对数据进行分组时无法重新排序。
无论如何,您的 XAML 将如下所示:
<Grid Background="Black">
<Grid.DataContext>
<local:MyModel/>
</Grid.DataContext>
<GridView CanReorderItems="True" CanDragItems="True" AllowDrop="True"
ItemsSource="{Binding Items}">
</GridView>
</Grid>
尽管 anyenumerable
可以绑定到ItemsSource
a GridView
,但它只有一个ObservableCollection
可以重新排序。是的,您可以使用实现重新排序的自定义类型,但为什么要在ObservableCollection
什么时候为您解决这个问题呢?
您的视图模型可能如下所示:
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);
}
}
在上面的代码中,重新排序event
不是真实的。它源自CollectionChanged
事件中的“删除”操作和“添加”操作的组合。这就是为什么这很棒。如果重新订购只能从 那里获得,GridView
那么ViewModel
将无法处理它。因为基础列表是您检测重新排序的方式,所以ViewModel
启用了。
每个案例都略有不同。您可能不关心索引,因此您可以简化代码。您可能不允许从集合中添加或删除,因此您只需要监视添加操作。同样,这取决于您的情况。我上面的示例代码应该可以处理 99% 的案例。
请记住,GridView
不是唯一允许重新排序的控件。任何基于ListViewBase
(如ListView
)的控件都支持重新排序 - 仍在使用ObservableCollection
. 但GridView
最常用的控件是使用此功能。当然。
哦,回答你的问题!
没有表明重新排序的事件。重新排序是基于基础ObservableCollection
CollectionChanged
事件中的操作组合的派生操作。有道理?
顺便说一句CollectionViewSource
,如果您选择,这里是绑定到 a 的示例语法:
<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>
祝你好运。