2013-11-07 3 views
0

Я пытаюсь выяснить, как отображать только определенный контент на новой странице, и мне интересно, как получить эти данные. Например, у меня есть кнопки, которые генерируются из проанализированных данных из листа xml, и когда я нажимаю кнопку, я хочу, чтобы кнопка нажимала на новую страницу xaml, которую я создал, и данные, связанные с этой кнопкой, отображаемой на новой странице xaml ,wp7 Отображение и связывание правильного элемента

Сначала я свяжу часть кода, который я использую, чтобы сохранить свои данные с моей xml-страницы.

`public int countElements = 0; 
    public MainViewModel() 
    { 
     this.Items = new ObservableCollection<ItemViewModel>(); 
    } 

    public ObservableCollection<ItemViewModel> Items { get; private set; } 


    public void LoadData() 
    { 

     var elements = from p in unmXdoc.Descendants(dataNamspace +  "vevent").Elements(dataNamspace + "properties") 
         select new ItemViewModel 
         { 
          summary = this.GetElementValue(p, "summary"), 
          description = this.GetElementValue(p, "description"), 
          categories = this.GetElementValue(p, "dtstamp"), 
         }; 

     foreach (var element in elements) 
     { 
      this.Items.Add(new ItemViewModel() 
      { 
       LineOne = element.summary, 
       LineTwo = element.categories, 
       LineThree = element.description 
      }); 
      countElements++; 
     } 

     this.IsDataLoaded = true;` 

Так LineOne это имя моей кнопки и при нажатии на кнопку Я хочу LineTwo и LineThree быть загружены на моей странице XAML, что я назвал LineThreePage.xaml. Я свяжу код xaml, где теперь создаются кнопки.

<Grid x:Name="LayoutRoot" Background="Transparent" > 
    <!--Pivot Control--> 
    <controls:Pivot Title="" Margin="0,64,0,-63"> 
     <!--Pivot item one--> 
     <controls:PivotItem> 
      <!-- Header="Events"--> 
      <controls:PivotItem.Header> 
       <TextBlock Text="Events" FontSize="48" ></TextBlock> 
      </controls:PivotItem.Header> 
      <!--Double line list with text wrapping--> 
      <ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Margin="0,0,0,17" Width="432" Height="78"> 
          <Button Margin="8,0,10,0" 
            Padding="0,0" 
            HorizontalContentAlignment="Left" 
            BorderThickness="0.8" 
            BorderBrush="Gray" 
            Background="White" 
            Width="420" 
            Click="Button_Click"> 
           <TextBlock Text="{Binding LineOne}" 
              TextWrapping="Wrap" 
              Foreground="#8f1020" 
              Style="{StaticResource PhoneTextNormalStyle}"/> 
          </Button> 
TextWrapping="Wrap" Margin="12,-10,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </controls:PivotItem>' 

Так в основном, когда я нажимаю button1 Я хочу, чтобы перейти к моей lineThreePage.xaml и увидеть LineTwo и LineThree, связанный с LineOne на этой странице.

Наконец, у меня есть код для кнопки ниже!

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.NavigationService.Navigate(new Uri("/lineThreePage.xaml", UriKind.Relative)); 
    } 

ответ

0

По существу, то, что вы ищете, - это способ сохранить «состояние» в приложении. Существует несколько способов сделать это, пара из них - App.Current.ApplicationLifetimeObjects и изолированное хранилище.

Одна из первых вещей, которые я делаю, когда я настраиваю новый проект WP, - это сортировать службу, которую я бы использовал для сохранения состояния в приложении. Предполагая, что ваш FirstListBox в вышеприведенном коде привязывается к сущности типа ItemViewModel.

1) Настройте универсальную службу класса хранения данных ... помните, что вы можете адаптировать ее к любым требованиям, предъявляемым к вашим требованиям, я сделал несколько предположений, таких как возврат нулей, когда значение не найдено в этом код,

public class IsolateStorageStore 
{ 
    /// <summary> 
    /// The iosolated settings store. 
    /// </summary> 
    private readonly IsolatedStorageSettings isolatedStorageSettings = IsolatedStorageSettings.ApplicationSettings; 

    public T ReadValue<T>(string key) 
    { 
     return isolatedStorageSettings.Contains(key) ? (T)isolatedStorageSettings[key] : default(T); 
    } 

    public void WriteValue<T>(string key, T value) 
    { 
     if (isolatedStorageSettings.Contains(key)) 
     { 
      isolatedStorageSettings[key] = value; 
     } 
     else 
     { 
      isolatedStorageSettings.Add(key, value); 
     } 
    } 
} 

2) Настройка механизма для чтения/записи сохраненного значения

public static class IsolatedStorageManager 
{ 
    private static IsolateStorageStore IsolateStorageStore = new IsolateStorageStore(); 

    public static ItemViewModel FeedItemViewModel 
    { 
     get 
     { 
      return IsolateStorageStore.ReadValue<ItemViewModel>("ItemFeedsKey"); 
     } 
     set 
     { 
      IsolateStorageStore.WriteValue("ItemFeedsKey", value); 
     } 
    } 

    public static object AnotherItem 
    { 
     get 
     { 
      return IsolateStorageStore.ReadValue<object>("AnotherItemKey"); 
     } 
     set 
     { 
      IsolateStorageStore.WriteValue("AnotherItemKey", value); 
     } 
    } 
} 

Теперь, когда у вас есть эффективное обслуживание для чтения/записи объектов для хранения, настроить свой код, чтобы использовать его.

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var button = (sender as Button); 

     if (button != null) 
     { 
      var data = button.DataContext as ItemViewModel; 

      if (data != null) 
      { 
       //Save to isolated storage 
       IsolatedStorageManager.FeedItemViewModel = data; 

       //redirect to next Page. 
       this.NavigationService.Navigate(new Uri("/lineThreePage.xaml", UriKind.Relative)); 
      } 
      else 
      { 
       MessageBox.Show("An error occured, either the sender is not a button or the data context is not of type ItemViewModel"); 
      } 
     } 
     else 
     { 
      MessageBox.Show("An error occured, either the sender is not a button or the data context is not of type ItemViewModel"); 
     } 
    } 

И, наконец, на странице lineThreePage.xaml, вам нужно прочитать значения, хранящиеся в изолированном хранилище

public lineThreePage() 
    { 
     InitializeComponent(); 

     BindData(); 
    } 


    private void BindData() 
    { 
     var data = IsolatedStorageManager.FeedItemViewModel; 

     if (data != null) 
     { 
      //Bind the data to a text box in your xaml named "txtDescription" 
      txtDescription.Text = data.LineTwo; 
     } 
    } 

Выполните поиск Изолированного хранения на здесь, чтобы найти несколько ресурсов как это использовать.

+0

Благодарим вас за отличный ответ! Помогли много, именно то, что мне было нужно !!! – visualbasicNoob9000

Смежные вопросы