WP7 - Отображение некоторых элементов в списке после нажатия кнопки Показать больше элементов - PullRequest
0 голосов
/ 26 марта 2012

Вот так выглядит мой список:

<ListBox x:Name="ForthListBox" 
           Margin="0,0,-12,0" 
           ItemsSource="{Binding Tops}"
           Tap="ForthListBox_Tap" Style="{StaticResource TopListBoxStyle}">
           <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17">
                      <TextBlock Text="{Binding Title}" 
                                 TextWrapping="Wrap" 
                                 Margin="12,0,0,0" 
                                 FontSize="40"/>
                     <TextBlock Text="{Binding Rating}" 
                                TextWrapping="NoWrap" 
                                Margin="12,-6,0,0" 
                                Style="{StaticResource PhoneTextSubtleStyle}"/>
                    </StackPanel>
                 </DataTemplate>
         </ListBox.ItemTemplate>
</ListBox>

Я отредактировал шаблон для списка, поэтому у меня есть кнопка в конце:

<Style x:Key="TopListBoxStyle" TargetType="ListBox">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Padding" Value="0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}">
                        <StackPanel><ItemsPresenter/>
                            <Button x:Name="BtnLoadMore" Click="BtnLoadMore_Click" Content="Další" />
                        </StackPanel>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

И у меня есть ObservableCollection<Top>() в MainViewModel который я связываю с DataContext.Это нормально и показывает мои элементы, но как я могу установить, что я хочу, чтобы в этом списке отображалось только 50 элементов, и после того, как я нажал кнопку, я хочу показать, что первые 50 элементов и еще 50 элементов из коллекции и снова и снова, иесли в коллекции больше нет предметов, которые не отображаются, то нажмите кнопку «Скрыть».Спасибо

Ответы [ 3 ]

2 голосов
/ 06 сентября 2012

удалось скрыть кнопку, используя следующий код

private void BtnLoadMore_Click(object sender, RoutedEventArgs e)
{
    AddMoreItems();
    Button b = sender as Button;
    b.Visibility = System.Windows.Visibility.Collapsed;
}
0 голосов
/ 27 марта 2012

Попробуйте этот пример проекта. Вместо того, чтобы иметь вертикальное смещение списка в этом примере, используйте кнопку по вашему желанию.

http://blogs.microsoft.co.il/blogs/shair/archive/2011/04/06/wp7-how-to-extend-listbox-when-reaching-last-item.aspx

0 голосов
/ 26 марта 2012

В вашей ViewModel может быть переменная, которая отслеживает, сколько раз была нажата кнопка. Затем в своем геттере для ObservableCollection вы можете использовать LINQ и оператор Take. Примерно так:

 public class MainPageViewModel : INotifyPropertyChanged {
        private ObservableCollection<string> _myList;
        private int _clickCount;
        private const int ItemsPerPage = 25;

        public MainPageViewModel() {
            _myList = new ObservableCollection<string>();
            _clickCount = 1;
            PopulateList();
        }

        private void PopulateList() {
            for (int i = 0; i < 100; i++) {
                _myList.Add(string.Format("item {0}", i));
            }
        }

        public ObservableCollection<string> TheList {
            get { return new ObservableCollection<string>(_myList.Take(_clickCount * ItemsPerPage).ToList()); } 
        }

        public void IncrementClickCount() {
            if (_clickCount * ItemsPerPage < _myList.Count) {
                _clickCount += 1;
                RaisePropertyChanged("TheList");
            }
        }

        protected void RaisePropertyChanged(string property) {
            if(PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

А потом в MainPage.xaml.cs

  public partial class MainPage : PhoneApplicationPage {
        private MainPageViewModel _vm;
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            Loaded += (s, e) => {
                          _vm = new MainPageViewModel();
                          DataContext = _vm;
                      };
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            _vm.IncrementClickCount();
        }
    }

И просто привяжите свой ListBox к свойству TheList

Надеюсь, что поможет

...