我正在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