我使用Caliburn Micro和Reactive扩展为Windows phone7开发了一个应用程序。
这个应用程序有一个带有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,项目2调用SelectItem方法,项目23调用方法45,依此类推。并且项目之间没有依赖关系。
我已经停下来寻找bug了。问题出在哪里?
发布于 2012-09-05 15:01:50
在阅读了Caliburn.Micro的the discussion forum和the page in documentation之后,找到了解决方案。所有的问题都是因为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>我认为这不是一个完美的答案。所以如果有人能提供更好的答案和解释,我会很高兴的。
https://stackoverflow.com/questions/12268670
复制相似问题