LongListSelector and DataTemplateSelector

前端 未结 3 1134
无人共我
无人共我 2021-02-15 14:53

I\'m using the LongListSelector to realize List or Grid display for my items. For this, I created a DataTemplateSelector and I change the LayoutMode property at runtime. This is

相关标签:
3条回答
  • 2021-02-15 14:55

    I've done something similar with my app, but allowed the user to choose the LayoutMode of LLS using an Appbar button. I basically change the LongListSelector.LayoutMode and then it's ItemTemplate in code and the LLS automatically refreshes itself. I'm not sure if this will help, but here's my code.

    private void layoutModeButton_Click(object sender, EventArgs e)
        {
            ApplicationBarIconButton layoutModeButton = (ApplicationBarIconButton)ApplicationBar.Buttons[0];
    
            if (MainLongListSelector.LayoutMode == LongListSelectorLayoutMode.Grid)
            {
                MainLongListSelector.LayoutMode = LongListSelectorLayoutMode.List;
                MainLongListSelector.ItemTemplate = this.Resources["ListListLayout"] as DataTemplate;
                layoutModeButton.IconUri = _gridButtonUri;
                layoutModeButton.Text = "grid";
            }
            else
            {
                MainLongListSelector.LayoutMode = LongListSelectorLayoutMode.Grid;
                MainLongListSelector.ItemTemplate = this.Resources["GridListLayout"] as DataTemplate;
                layoutModeButton.IconUri = _listButtonUri;
                layoutModeButton.Text = "list";
            }
        }
    

    You might have figured out the answer already, but just to add to the conversation: this gives me really good performance for a fairly large amount of data. Maybe you can do something similar when navigating back to the page after changing the layout in settings?

    0 讨论(0)
  • 2021-02-15 15:09

    I haven't got the solution but maybe a clue for someone who will solve the problem.
    I think the problem is with LongListSelector.UpdateLayout() method - when it's fired for the first time there are no items to which LLS was bound - OnChangeMethod is called that many times as the Itemsource.Count. But when we leave the page and go back - LLS is Updated and method is called ommiting the middle element.
    It means it works for even number of items - OnChangeMethod is called correct number of times, But for odd number of items - it's called numer of items - 1.
    The second thing is why it's called at all - when there are no changes.

    I also add a code to work on which (very simple).

    0 讨论(0)
  • 2021-02-15 15:21

    Here is one walk around. (Maybe the problem will be corrected with WP 8.1 Update, along with others I've spotted working with LLS. I know - this idea is ugly, hard and so on, but maybe it will be enough for your purpose:

    Becouse the problem concerns 'reloading' LLS, I've forced it to initialize it every time I navigate to the page (in fact I need to initialize the whole Page - it won't work only with LLS). I've moved InitializeComponent() and buttons events and so on to OnNavigatedTo():

     protected override void OnNavigatedTo(NavigationEventArgs e)
      {
         base.OnNavigatedTo(e);
    
         this._contentLoaded = false;
         InitializeComponent();
    
         first.Click += first_Click;
         second.Click += second_Click;
         ItemLongListSelector.ItemsSource = Items;
      }
    

    At least OnContentChanged() is fired that many Times its needed. Code you can find here.

    0 讨论(0)
提交回复
热议问题