2014-09-12 1 views
0

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

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, кнопка 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 (или вообще программирую), и у меня нет опыта в этом. Спасибо!

+0

Так что вопрос вы испытываете сейчас? – Kulasangar

ответ

0

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

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

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

+0

Да, это ObservableCollection. public MainViewModel() { this.Items = new ObservableCollection (); } –

0

Вы можете использовать строку запроса для передачи строки данных в 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" 
} 

Для справки: How to pass values (parameters) between XAML pages?

+0

Выглядит очень разумно. Позвольте мне поработать над работой. Я дам Вам знать. –

+0

Я такой дурак :( Я еще не смог его отфильтровать. Это не значит, что советы не очень хорошие. Просто я не могу заставить их работать. –

+0

@GeovanniOrtega Вы имеете в виду 'LoadData()' part? Как вы пытались его реализовать? (Редактируйте вопрос и добавьте последний код, который вы пробовали) – har07

0

Я предлагаю вам привязать событие 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 
    }