我正在WP8.1上工作,我发现我的Listbox的横行为 - 使其更容易重现我已经把the code here。设备和模拟器都会出现此问题。Listbox - 无法选择填充后的第一个元素ItemsSource
我已经被绑定到的ObservableCollection一个列表框,它是充满在点击按钮项目:
public sealed partial class MainPage : Page
{
List<string> populationOfItems = new List<string>();
ObservableCollection<string> itemsToView = new ObservableCollection<string>();
public MainPage()
{
this.InitializeComponent();
second.Click += second_Click;
myList.ItemsSource = itemsToView;
// populate list of items to be copied
for (int i = 0; i < 6; i++) populationOfItems.Add("Item " + i.ToString());
BottomAppBar = new CommandBar();
}
private async void second_Click(object sender, RoutedEventArgs e)
{
itemsToView.Clear();
await PopulateList();
}
private async Task PopulateList()
{
await Task.Delay(100); // without this line code seems to work ok
itemsToView.Add("FIRSTELEMENT"); // add first differet element
foreach (var item in populationOfItems)
itemsToView.Add(item);
}
}
我第一次填充列表,寄托都是确定的(图一)。但是当我第二次按下按钮时,我可以看到不是从第一个而是从第二个(图2)的元素。好的 - 它在上面,但我可以滚动到它,当我握住我的手指(鼠标)我可以滚动列表并看到它存在,但是当我停止滚动列表隐藏(滚动到第二个元素)第一个元件。另外,当您选择任何项目时 - 当您握住您的手指时,列表似乎看起来很好(图3),当您释放它时,会再次隐藏第一个元素。当您上下移动列表几次时,它会修复并正常工作。
重现该问题的方式:
- 点击scond按钮一次 - 填充列表
- 滚动列表下来,让你躲的第一要素(这是很重要的)
- 再次点击第二个按钮
- 尝试向上滚动列表并查看第一个元素,释放手指
Pic.1
Pic.2
Pic.3
这个问题似乎与异步任务(这就是为什么我还标记了这个问题异步)关注 - 没有行await Task.Delay(100);
,代码似乎工作正常。
有没有人有一个想法可能是错的?
编辑 - 一些其他的尝试
我也试着运行通过Dispatcher
填充过程中,没有成功 - 问题的存在。
我也尝试填充临时List
(不是ObservableCollection),并且从async Task
返回后,填充ObservableCollection - 问题依然存在。
List<string> temporaryList = new List<string>();
private async Task PopulateList()
{
await Task.Delay(100); // without this line code seems to work ok
temporaryList.Clear();
temporaryList.Add("FIRSTELEMENT"); // add first differet element
foreach (var item in populationOfItems)
temporaryList.Add(item);
}
private async void second_Click(object sender, RoutedEventArgs e)
{
itemsToView.Clear();
await PopulateList();
foreach (var item in temporaryList)
itemsToView.Add(item);
}
编辑2 - 在acync任务创建也没有多大帮助returnig列表:
private async void second_Click(object sender, RoutedEventArgs e)
{
itemsToView.Clear();
var items = await PopulateList();
foreach (var item in items)
itemsToView.Add(item);
}
private async Task<IEnumerable<string>> PopulateList()
{
await Task.Delay(100); // without this line code seems to work ok
List<string> temporaryList = new List<string>();
temporaryList.Add("FIRSTELEMENT"); // add first differet element
foreach (var item in populationOfItems)
temporaryList.Add(item);
return temporaryList;
}
编辑3 - 为我检查下的Windows Phone 8.1上运行相同的代码Silverlight的工作没有问题。
谢谢你的答案。我知道你说过的话。这是我的第一个想法,它可能是关注“其他线程” - 所以我想通过'Dispatcher'运行填充过程(如果你已经下载了我的代码,那么你应该会看到一个与调度第二种方法)。没什么帮助。另请参阅我的编辑问题 - 我也尝试通过单独的临时列表与UI没有连接=没有任何帮助。至于我这个问题似乎是与Listbox本身,也许它的动画 - 但我不知道 - 也许我做错了什么。 – Romasz
您是否尝试过我推荐的方法? –
是的,我已经试过 - 您的例子只是返回一个引用,请列出不被修改(我需要内异步任务修改它 - 这是它是为创建)。我遵循你的建议(见我的第二次编辑),但问题仍然存在。你有什么想法吗? – Romasz