在源

时间:2015-12-11 10:58:58

标签: c# xaml windows-runtime windows-10 uwp

我正在开发一种自定义排序方法,让用户只需向上或向下移动所选项目,一次只能移动一个位置。 我通过动画两个目标ListView容器,然后交换ListView的源集合中的两个数据模型(我使用ObservableCollection)然后在两个容器中设置动画来实现这一点。

它看起来像这样:

// Fade the containers out
ListViewItem targetContainer = MyListView.ContainerFromIndex(target).Cast<ListViewItem>();
ListViewItem currentContainer = MyListView.ContainerFromIndex(index).Cast<ListViewItem>();

// Just some method to programmatically create animations
Storyboard targetOut = targetContainer.GetFadeSlideStoryboard(TranslationAxis.X, 1, 0, 0, 20, 150);
Storyboard currentOut = currentContainer.GetFadeSlideStoryboard(TranslationAxis.X, 1, 0, 0, -20, 150);

// WaitAsync creates a task that completes when the Storyboard completes
List<Task> tasks = new List<Task> { targetOut.WaitAsync(), currentOut.WaitAsync() };
await Task.WhenAll(tasks);

// Switch the models
FieldModel swapped = ViewModel.Source[target];
ViewModel.Source[target] = field;
ViewModel.Source[index] = swapped;

// Fade the containers back in
targetContainer = FieldsList.ContainerFromIndex(target).Cast<ListViewItem>();
currentContainer = FieldsList.ContainerFromIndex(index).Cast<ListViewItem>();
targetOut = targetContainer.StartFadeSlideStoryboard(TranslationAxis.X, 0, 1, -20, 0, 150);
currentOut = currentContainer.StartFadeSlideStoryboard(TranslationAxis.X, 0, 1, 20, 0, 150);

它运行正常,唯一的问题是我认为ListView会重用两个可视容器,但它看起来像是再次呈现两个DataTemplates。

我的意思是,当我分配第一个交换的DataModel时,只有一秒钟的时间,目标DataTemplate消失,然后再次重新出现我刚刚分配的新DataModel。

它确实发生在眨眼之间,但这会导致整个ListView控件向上滑动,然后在渲染新的DataTemplate时立即退回。

有没有办法直接将两个DataModel分配到DataTemplates中,并将这些更改反映在我的源集合中? 这样ListView就不会再次渲染这些容器了。

感谢您的帮助!

塞尔吉奥

0 个答案:

没有答案