首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ListBox (Windows Phone、Caliburn.Micro、Rx)中的项目选择错误

ListBox (Windows Phone、Caliburn.Micro、Rx)中的项目选择错误
EN

Stack Overflow用户
提问于 2012-09-05 01:39:39
回答 1查看 639关注 0票数 1

我使用Caliburn Micro和Reactive扩展为Windows phone7开发了一个应用程序。

这个应用程序有一个带有ListBox控件的页面:

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<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如下所示:

代码语言:javascript
运行
复制
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将使用以下项目进行填充:

代码语言:javascript
运行
复制
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了。问题出在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-05 15:01:50

在阅读了Caliburn.Micro的the discussion forumthe page in documentation之后,找到了解决方案。所有的问题都是因为Caliburn.Micro的约定。

为了解决这个问题,我在DataTempalate中添加了下面的代码:cal:View.Model={Binding}。现在,包含ListBox的页面的一部分如下所示:

代码语言:javascript
运行
复制
<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>

我认为这不是一个完美的答案。所以如果有人能提供更好的答案和解释,我会很高兴的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12268670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档