C# 本地保存和加载列表框项目,并将其传递到其他页面

C# 本地保存和加载列表框项目,并将其传递到其他页面,c#,windows-8,windows-store-apps,C#,Windows 8,Windows Store Apps,我目前正在c#中开发Windows应用商店应用程序 现在,, 我有一个列表框“Listbox1”,它从文本框“tasks”中获取按钮单击事件中的项目,并在其他按钮单击事件中具有selected items delete属性 private void add_Click(object sender, RoutedEventArgs e) { string t; t = tasks.Text; if (t != "") {

我目前正在c#中开发Windows应用商店应用程序

现在,, 我有一个列表框“Listbox1”,它从文本框“tasks”中获取按钮单击事件中的项目,并在其他按钮单击事件中具有selected items delete属性

private void add_Click(object sender, RoutedEventArgs e)
    {
        string t;
        t = tasks.Text;
        if (t != "")
        {
            Listbox1.Items.Add(t);
        }
        else
        {
            var a = new MessageDialog("Please Enter the Task First");
            a.Commands.Add(new UICommand("Ok"));
            a.ShowAsync();
        }
        tasks.Text = "";
    }

    private void del_Click(object sender, RoutedEventArgs e)
    {
        for (int p = 0; p < Listbox1.SelectedItems.Count; p++)
        {
            Listbox1.Items.Remove(Listbox1.SelectedItems[p].ToString());
            p--;
        }
    }
private void add\u单击(对象发送者,路由目标)
{
字符串t;
t=任务。文本;
如果(t!=“”)
{
列表框1.Items.Add(t);
}
其他的
{
var a=新建消息对话框(“请先输入任务”);
a、 添加(新的UICommand(“Ok”);
a、 ShowAsync();
}
任务。Text=“”;
}
私有无效删除单击(对象发送者,路由目标e)
{
对于(int p=0;p
现在,我想在用户完成更改后(可能在按钮单击事件上),将此列表保存到本地应用程序存储中。 以及将所有列表框项目发送到其他页面

我不是一个程序员,我设计东西

请通过样品或参考来指导我


提前感谢:)

如果您已经将数据存储到本地存储器,您可以在导航到另一页的
覆盖中读取数据。否则,请使用导航参数:

编辑:我不确定您是否还需要一些有关本地存储的信息。这很简单:
Windows.Storage.ApplicationData.Current.LocalSettings
有一个名为Values的属性,它是一个可以将设置写入的
字典。看看

编辑:尝试类似以下代码的方法来存储列表

// Try to get the old stuff from local storage.
object oldData = null;
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
bool isFound = settings.Values.TryGetValue("List", out oldData);

// Save a list to local storage. (You cannot store the list directly, because it is not
// serialisable, so we use the detours via an array.)
List<string> newData = new List<string>(new string[] { "test", "blah", "blubb" });
settings.Values["List"] = newData.ToArray();

// Test whether the saved list contains the expected data.
Debug.Assert(!isFound || Enumerable.SequenceEqual((string[]) oldData, newData));
//尝试从本地存储中获取旧内容。
对象oldData=null;
ApplicationDataContainer设置=ApplicationData.Current.LocalSettings;
bool isFound=settings.Values.TryGetValue(“列表”,输出旧数据);
//将列表保存到本地存储。(不能直接存储列表,因为它不是
//可序列化,因此我们通过数组使用迂回。)
List newData=newlist(新字符串[]{“test”、“blah”、“blubb”});
settings.Values[“List”]=newData.ToArray();
//测试保存的列表是否包含预期数据。
Debug.Assert(!isFound | | Enumerable.SequenceEqual((字符串[])oldData,newData));
注意,这只是用于测试的演示代码-它没有实际意义

编辑:一条建议:不要在单击处理程序中持久化列表,因为随着列表的增长,这将变得非常缓慢。我将在导航处理程序中加载并保存列表,即添加如下内容

protected override void OnNavigatedTo(NavigationEventArgs e) {
    base.OnNavigatedTo(e);
    if (this.ListBox1.ItemsSource == null) {
        object list;
        if (ApplicationData.Current.LocalSettings.Values.TryGetValue("List", out list)) {
            this.ListBox1.ItemsSource = new List<string>((string[]) list);
        } else {
            this.ListBox1.ItemsSource = new List<string>();  
        }
    }
}

protected override void OnNavigatedFrom(NavigationEventArgs e) {
    if (this.ListBox1.ItemsSource != null) {
        ApplicationData.Current.LocalSettings.Values["List"] = this.ListBox1.ItemsSource.ToArray();         
    }
    base.OnNavigatedFrom(e);
}
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e){
基地。导航到(e);
if(this.ListBox1.ItemsSource==null){
对象列表;
if(ApplicationData.Current.LocalSettings.Values.TryGetValue(“列表”,输出列表)){
this.ListBox1.ItemsSource=新列表((字符串[])列表);
}否则{
this.ListBox1.ItemsSource=新列表();
}
}
}
受保护的覆盖无效OnNavigatedFrom(NavigationEventArgs e){
如果(this.ListBox1.ItemsSource!=null){
ApplicationData.Current.LocalSettings.Values[“List”]=this.ListBox1.ItemsSource.ToArray();
}
基于(e)的导航;
}

这是一个非常好的简单示例,介绍在winRT应用程序开发中使用SQLite数据库的情况。查看它,您将知道如何在本地计算机上存储数据。我从这个示例中学习了基本代码

现在,为了便于导航,让我为您的应用程序的这一部分建议一个流程

取一个
字符串的
可观测集合
,并存储 使用
onClick()
将该文本框插入此ObservationCollection,然后 请将
ObservableCollection
参阅 列表框

现在,当您需要将数据发送到下一页时,为下一页创建一个参数化构造函数,并将该
observateCollection
作为参数传递

现在,您可以在构造函数中访问这些数据,并可以根据需要使用它们


希望这会有所帮助。

不,我还没有存储数据。这就是最让我头疼的地方,因为每当应用程序重新启动时,所有更改都会丢失。您是否将这些内容写入了
ApplicationDataContainer
?我添加了一个适合我的样品。在第一次运行中,
isFound
false
,之后,它应该是
true
oldData
应该包含字符串。