C# 如何在文件中保存列表视图并在以后加载?超宽带#

C# 如何在文件中保存列表视图并在以后加载?超宽带#,c#,file,listview,uwp,settings,C#,File,Listview,Uwp,Settings,我在UWP应用程序中有一个ListView,其中有许多ListView作为其ListViewItems。主ListView中的ListView是自定义ListViewItems的列表(带有一个网格,其中包含元素作为其内容) 用户始终可以在主ListView的ListView中添加或删除自定义ListViewItems,也可以在主ListView中添加或删除整个ListView 我想将用户所做的所有更改保存在应用程序设置或文件中(保存创建的ListView和自定义ListViewItems并在启动

我在UWP应用程序中有一个ListView,其中有许多ListView作为其ListViewItems。主ListView中的ListView是自定义ListViewItems的列表(带有一个网格,其中包含元素作为其内容)

用户始终可以在主ListView的ListView中添加或删除自定义ListViewItems,也可以在主ListView中添加或删除整个ListView

我想将用户所做的所有更改保存在应用程序设置或文件中(保存创建的ListView和自定义ListViewItems并在启动时加载)

有办法做到这一点吗?

我所尝试的:

  • JSON转换(
    JsonConvert.serializeObject()
    )导致堆栈溢出异常
  • BinaryFormatter导致异常,表示ListView不可序列化
请提供显示如何保存和加载ListView的代码

应用程序结构如下所示:


主ListView(应保存)>主ListView项(ListView)(可由用户添加/删除)>自定义ListViewItems(不仅仅是字符串)(可由用户添加/删除)

根据您的要求,您需要使用数据源设计嵌套ListView并将数据源存储到文件中。正如Klaus Gütter所说,ListViewItems不支持序列化

比如说

Xaml代码

<Grid>
    <ListView ItemsSource="{x:Bind Items}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ListView ItemsSource="{Binding}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Content}" />
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Content="SaveList" Click="Button_Click"/>
</Grid>

代码隐藏

public sealed partial class MainPage : Page
{
    public ObservableCollection<ObservableCollection<ListContent>> Items { set; get; }
    public MainPage()
    {
        this.InitializeComponent();
     
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
        Object value = localSettings.Values["exampleSetting"];

        if (value == null)
        {
            var list1 = new ObservableCollection<ListContent>() { new ListContent { Content = "1" }, new ListContent { Content = "2" }, new ListContent { Content = "3" } };
            var list2 = new ObservableCollection<ListContent>() { new ListContent { Content = "A" }, new ListContent { Content = "B" }, new ListContent { Content = "C" } };
            var list3 = new ObservableCollection<ListContent>() { new ListContent { Content = "一" }, new ListContent { Content = "二" }, new ListContent { Content = "三" } };
            Items = new ObservableCollection<ObservableCollection<ListContent>>() { list1, list2, list3 };
        }
        else
        {
            Items = JsonConvert.DeserializeObject<ObservableCollection<ObservableCollection<ListContent>>>(value.ToString());
        }
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        string json = JsonConvert.SerializeObject(Items);
        var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

        // Create a simple setting.
        localSettings.Values["exampleSetting"] = json;

        // Read data from a simple setting.
      
    }
}
public class ListContent
{
    public string Content { get; set; }
}
公共密封部分类主页面:第页
{
公共可观察集合项{set;get;}
公共主页()
{
this.InitializeComponent();
}
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
基地。导航到(e);
var localSettings=Windows.Storage.ApplicationData.Current.localSettings;
对象值=本地设置。值[“exampleSetting”];
如果(值==null)
{
var list1=newobservecollection(){new ListContent{Content=“1”},new ListContent{Content=“2”},new ListContent{Content=“3”};
var list2=newobserveCollection(){new ListContent{Content=“A”},new ListContent{Content=“B”},new ListContent{Content=“C”};
var list3=new observeCollection(){new ListContent{Content=”一" }, 新列表内容{Content=”二},新列表内容{Content='三" } };
Items=newobserveCollection(){list1,list2,list3};
}
其他的
{
Items=JsonConvert.DeserializeObject(value.ToString());
}
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
字符串json=JsonConvert.SerializeObject(项);
var localSettings=Windows.Storage.ApplicationData.Current.localSettings;
//创建一个简单的设置。
Values[“exampleSetting”]=json;
//从简单设置中读取数据。
}
}
公共类列表内容
{
公共字符串内容{get;set;}
}

通常情况下,您不会保存ListViewItems(即UI元素),而是保存从中创建它们的数据(即模型)。添加的ListViewItems(ListView)是自定义的,可以添加或删除它们的ListViewItems。我需要保存主列表视图、ListViewItems列表(ListView)(
List
)或者可能是列表视图的集合,如果其中任何内容可以保存在任何位置(设置、文件或其他方式)。为什么不将itemsource序列化为json并将其保存到文件中?您是指
mainListView.ItemsSource
哪些是多个ListView?如果可能的话,您可以共享一个链接来说明它是如何完成的吗?我尝试将主列表视图序列化为json,结果导致堆栈溢出异常,我不知道ItemsSource会出现什么情况。我是说,您没有eed使用数据源设计listview并将数据源存储到文件中。正如Klaus Gütter所说,ListViewItems不支持序列化。如果ListContent不仅仅是一个文本块,如何创建它?在这种情况下,将创建一个网格
grid tileGrid=new grid()
然后是一个图像和一个文本块,它们被添加到网格
tileGrid.Children.Add(tileImage);tileGrid.Children.Add(tileText);
然后它被设置为项目的内容
ListViewItem item=new ListViewItem(){content=tileGrid,};
您可以根据自己的设计编辑xaml代码