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