[英]Facebook authentication callback on Windows Phone using Caliburn.Micro
[英]Wrong item selection in ListBox (Windows Phone, Caliburn.Micro, Rx)
我使用Caliburn Micro和Reactive Extensions開發了適用於Windows Phone 7的應用程序。
該應用程序具有一個帶有ListBox
控件的頁面:
<Grid x:Name="ContentPanel"
Grid.Row="1"
Margin="12,0,12,0">
<ListBox ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<Views:ItemView Margin="0,12,0,0" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
我正在使用下一個ItemView
作為DataTemplate
:
<UserControl ...>
<Grid x:Name="LayoutRoot"
cal:Message.Attach="[Event Tap] = [Action SelectItem]">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Style="{StaticResource PhoneTextLargeStyle}"
Text="{Binding Name}"
TextWrapping="Wrap" />
<TextBlock Grid.Column="1"
Foreground="{StaticResource PhoneDisabledBrush}"
Style="{StaticResource PhoneTextLargeStyle}"
Text="{Binding Id}" />
</Grid>
</UserControl>
相應的ItemViewModel
如下所示:
public class ItemViewModel
{
private readonly INavigationService _navigationService;
public int Id { get; private set; }
public string Name { get; private set; }
public ItemViewModel(Item item)
{
Id = item.Id;
Name = item.Name;
_navigationService = IoC.Get<INavigationService>();
}
public void SelectItem()
{
_navigationService.UriFor<MainViewModel>()
.WithParam(x => x.Id, Id)
.Navigate();
}
}
}
ListBox
填充以下項目:
public class ListViewModel : Screen
{
private readonly IItemsManager _itemsManager;
private List<ItemViewModel> _items;
public List<ItemViewModel> Items
{
get { return _items; }
private set
{
_items = value;
NotifyOfPropertyChange(() => Items);
}
}
public ListViewModel(IItemsManager itemsManager)
{
_itemsManager = itemsManager;
}
protected override void OnViewReady(object view)
{
base.OnViewReady(view);
Items = null;
var list = new List<ItemViewModel>();
_itemsManager.GetAll()
.SubscribeOn(ThreadPoolScheduler.Instance)
.ObserveOnDispatcher()
.Subscribe((item) => list.Add(new ItemViewModel(item)),
(ex) => Debug.WriteLine("Error: " + ex.Message),
() =>
{
Items = list;
Debug.WriteLine("Completed"));
}
}
}
問題就從這里開始。
_itemsManager
正確返回所有項目。 並且所有項目正確顯示在ListBox
。 大約有150個項目。
當我點擊一個項目時,則必須調用相應ItemViewModel
中的SelectItem
方法。 並且對於ListBox
前10到20個項目,一切正常。 但是對於所有接下來的項目,在絕對錯誤的ItemViewModel
調用SelectItem
方法。 例如,我點擊項目34,選擇SelectItem
方法,我點擊45-項目23的方法,依此類推。 並且項目之間不存在依賴關系。
我已經在尋找bug時大吃一驚了。 可能是什么問題?
閱讀討論論壇和Caliburn.Micro 文檔中的頁面后,找到了解決方案。 所有問題都是由於Caliburn.Micro的約定造成的。
為了解決該問題,我向DataTempalate
添加了以下代碼: cal:View.Model={Binding}
。 現在帶有ListBox
的頁面的一部分看起來像這樣:
<Grid x:Name="ContentPanel"
Grid.Row="1"
Margin="12,0,12,0">
<ListBox ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<Views:ItemView Margin="0,12,0,0" cal:View.Model={Binding}/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
我認為這不是一個完美的答案。 因此,如果有人可以提供更好的答案和解釋,我將感到非常高興。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.