Выбор элементов из списка по нажатию кнопки. WP8

Мне нужна помощь в этом. У меня есть список MVVM из 20 элементов в файле MainViewModel.cs:

 public MainViewModel()
    {
        this.Items = new ObservableCollection<ItemViewModel>();
    }
public ObservableCollection<ItemViewModel> Items { get; private set; }

public void LoadData(int part)                                  
{                                   
    if (part == 1)
    {
            this.Items.Add(new ItemViewModel()
            { ID = "0", Title = "Title 0...", Image = "/Images/img001.jpg", Description = "Description 0" });
            this.Items.Add(new ItemViewModel()
            { ID = "1", Title = "Title 1", Image = "/Images/img002.jpg", Description = "Description 1" });
            // And so on from Item 0 to Item 4

     }
     if (part == 2)
     {
            this.Items.Add(new ItemViewModel()
            { ID = "5", Title = "Title 5", Image = "/Images/img006.jpg", Description = "Description 5" });
            this.Items.Add(new ItemViewModel()
            { ID = "6", Title = "Title 6", Image = "/Images/img007.jpg", Description = "Description 6" });
            //And so on from Item 5 to Item 9
      }
      this.IsDataLoaded = true;
}                                   

И список из 5 кнопок:

<phone:Panorama Grid.Row="1" Margin="0,3,0,3">
      <phone:PanoramaItem Header="Semanas 1 - 5" HeaderTemplate="{StaticResource MyItemHeaderTemplate}">
            <StackPanel x:Name="Semanas1a5">
                    <Button Content="Semana 1" Click="Button_Click_1"/>
                    <Button Content="Semana 2" Click="Button_Click_2"/>
                    <Button Content="Semana 3" Click="Button_Click_3"/>
                    <Button Content="Semana 4" Click="Button_Click_4"/>
                    <Button Content="Semana 5" Click="Button_Click_5"/>
            </StackPanel>
      </phone:PanoramaItem>
</phone:Panorama>

Вот что мне нужно сделать. При нажатии каждой из этих кнопок Button1 должен отображать элементы от 0 до 4, Button 2 должен отображать элементы от 5 до 9 и так далее. До сих пор я могу связать весь список, поэтому каждая кнопка открывает полный список для просмотра.

Вот что у меня есть для каждой кнопки в обработчике Button_Click_n:

 private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        NavigationService.Navigate(new Uri("/DataBoundApp1;component/MainPage.xaml?dataPart=1", UriKind.Relative));
    //The rest of the butons are the same, just updating dataPart = 2, 3, etc.
    }

Затем MainPage.xaml определяется следующим образом:

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBlock Text="Tips Semana 1" Style="{StaticResource WeekHeader}"/>

            <ListBox x:Name="MainLongListSelector" Margin="10,5,0,10" 
                     Background="#50F5F5F5" Foreground="Black"
                     ItemsSource="{Binding Items}"
                     SelectionChanged="MainLongListSelector_SelectionChanged" >

                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding Image}" Width="100" Height="100" Stretch="Uniform"/>
                            <TextBlock Text="{Binding Title}" TextWrapping="Wrap" Margin="10" 
                                       FontSize="25" VerticalAlignment="Center"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>

И MainPage.cs

public partial class MainPage : PhoneApplicationPage
{
    public string dataPart = string.Empty;
    public int part;
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData(int part);
        }
    }

    private void MainLongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (MainLongListSelector.SelectedItem == null)
            return;
        NavigationService.Navigate(new Uri("/DataBoundApp1;component/DetailsPage.xaml?selectedIndex=" + (MainLongListSelector.SelectedItem as ItemViewModel).ID, UriKind.Relative));
        MainLongListSelector.SelectedItem = null;
    }

}

Затем я перенаправляюсь в App.cs, где мне нужно обновить LoadData, чтобы получить параметр, это заканчивается так:

private void Application_Activated(object sender, ActivatedEventArgs e)

    public int part;
    {
        // Ensure that application state is restored appropriately
        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData(int part);
        }
    }

При этом при нажатии любой из кнопок приложение закрывается (без исключений, без ошибок, просто закрывается). Кто-нибудь может мне помочь? Я новичок в WP8 (или вообще в программировании) и не имею опыта в этих вещах. Благодарю вас!


person Geovanni Ortega    schedule 12.09.2014    source источник
comment
Так в чем проблема у вас сейчас?   -  person Kulasangar    schedule 12.09.2014


Ответы (3)


Вы не указали тип элементов. поэтому, пожалуйста, дайте более подробную информацию об этом.

Если это ObeserableCollection, то ниже должно работать решение.

Вы можете иметь весь свой список как отдельный глобальный список. и при каждом нажатии кнопки вы можете применить фильтр к своему глобальному списку и создать свой список элементов в соответствии с ним. Я думаю, это должно сработать.

person jadavparesh06    schedule 12.09.2014
comment
Да, это ObservableCollection. public MainViewModel() { this.Items = new ObservableCollection‹ItemViewModel›(); } - person Geovanni Ortega; 12.09.2014

Вы можете использовать строку запроса для передачи строковых данных в MainPage.xaml :

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    NavigationService.Navigate(new Uri("/DataBoundApp1;component/MainPage.xaml?dataPart=1", UriKind.Relative));
}

Затем в MainPage.xaml прочитайте строку запроса и соответственно загрузите данные:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string dataPart = string.Empty;
    if (NavigationContext.QueryString.TryGetValue("dataPart", out dataPart)) 
    {
        int part = int.Parse(dataPart);
        LoadData(int part);
    }
}

public void LoadData(int part)                                  
{                                   
    //load relevant items according to parameter "part"
}

Для справки: Как передавать значения (параметры) между страницами XAML?

person har07    schedule 12.09.2014
comment
Выглядит очень разумно. Позвольте мне взяться за работу. Я дам Вам знать. - person Geovanni Ortega; 12.09.2014
comment
Я такой дурак :( Я еще не смог его отфильтровать. Дело не в том, что советы плохие. Просто я не в состоянии заставить их работать. - person Geovanni Ortega; 18.09.2014
comment
@GeovanniOrtega Вы имеете в виду часть LoadData()? Как вы пытались это реализовать? (отредактируйте вопрос и добавьте последний код, который вы пробовали) - person har07; 18.09.2014
comment
Ага. Я имею в виду ту часть. - person Geovanni Ortega; 19.09.2014

Я предлагаю вам привязать событие Button Click всех 4 кнопок к команде и передать параметр как (1, 2, 3, 4), чтобы указать, какой сегмент должен быть загружен.

Обработчик команд свяжет 5 элементов с наблюдаемой коллекцией, которая будет отражена.

                <Button Content="Btn1">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <i:InvokeCommandAction Command="{Binding LoadSegmentCommand}" CommandParameter="{Binding SegmentNumber}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button> 

В модели представления

    public ICommand LoadSegmentCommand
    {
        get { return new RelayCommand<int>(OnLoadSegmentCommandCommandReceived); }
    }

    private void OnLoadSegmentCommandCommandReceived(int segment)
    {
        // Assign the data to Observable Collection
    }
person Arjun K R    schedule 13.09.2014