簡體   English   中英

ListBox中的項目選擇錯誤(Windows Phone,Caliburn.Micro,Rx)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM