簡體   English   中英

wp7顯示和鏈接正確的項目

[英]wp7 Displaying and Linking the Correct Item

我試圖弄清楚如何僅在新頁面上顯示特定內容,並且想知道如何檢索該數據。 例如,我有一些按鈕是根據xml工作表中的解析數據生成的,當我單擊該按鈕時,我希望該按鈕直接指向我創建的新xaml頁面,並在新的xaml頁面上顯示與該按鈕相關的數據。

首先,我將鏈接一些我用來存儲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加載到名為LineThreePage.xaml的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並在該頁面上看到與LineOne關聯的LineTwo和LineThree。

最后,我在下面輸入了我的按鈕點擊代碼!

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

本質上,您正在尋找的是一種在應用程序中保留“狀態”的方法。 有幾種方法可以做到這一點,其中有兩種是App.Current.ApplicationLifetimeObjects和Isolated存儲。

設置新的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;
        }
    }

在此處搜索“隔離存儲”,以找到一些使用方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM