如何将列表视图保存在文件中并稍后加载? UWP C#
How to save a List View in a file and load it later? UWP C#
我在 UWP 应用程序中有一个 ListView,其中有许多 ListView 作为其 ListViewItems。主 ListView 内的 ListView 是自定义 ListViewItems 的列表(带有一个以元素作为内容的网格)。
用户始终可以添加或删除主 ListView 的 ListView 中的自定义 ListViewItems 或主 ListView 中的整个 ListView。
我想保存用户在应用程序设置或文件中所做的所有更改(保存创建的 ListView 和自定义 ListViewItems 并在启动时加载它们)
有办法吗?
我试过的:
- JSON 转换 (
JsonConvert.serializeObject()
) 导致堆栈溢出异常
- BinaryFormatter 导致异常,指出 ListView 不可序列化
请提供显示如何保存和加载 ListView 的代码
应用程序结构如下所示:
Main ListView(应保存)> Main ListView 项 (ListViews)(可以 added/removed 由用户)> 自定义 ListViewItems(不仅是字符串)(可以 added/removed 由用户)
根据您的要求,您需要设计带有数据源的嵌套列表视图并将数据源存储到文件中。正如 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; }
}
我在 UWP 应用程序中有一个 ListView,其中有许多 ListView 作为其 ListViewItems。主 ListView 内的 ListView 是自定义 ListViewItems 的列表(带有一个以元素作为内容的网格)。
用户始终可以添加或删除主 ListView 的 ListView 中的自定义 ListViewItems 或主 ListView 中的整个 ListView。
我想保存用户在应用程序设置或文件中所做的所有更改(保存创建的 ListView 和自定义 ListViewItems 并在启动时加载它们)
有办法吗?
我试过的:
- JSON 转换 (
JsonConvert.serializeObject()
) 导致堆栈溢出异常 - BinaryFormatter 导致异常,指出 ListView 不可序列化
请提供显示如何保存和加载 ListView 的代码
应用程序结构如下所示:
Main ListView(应保存)> Main ListView 项 (ListViews)(可以 added/removed 由用户)> 自定义 ListViewItems(不仅是字符串)(可以 added/removed 由用户)
根据您的要求,您需要设计带有数据源的嵌套列表视图并将数据源存储到文件中。正如 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; }
}