C# 如何在文件中保存列表视图并在以后加载?超宽带#
我在UWP应用程序中有一个ListView,其中有许多ListView作为其ListViewItems。主ListView中的ListView是自定义ListViewItems的列表(带有一个网格,其中包含元素作为其内容) 用户始终可以在主ListView的ListView中添加或删除自定义ListViewItems,也可以在主ListView中添加或删除整个ListView 我想将用户所做的所有更改保存在应用程序设置或文件中(保存创建的ListView和自定义ListViewItems并在启动时加载) 有办法做到这一点吗? 我所尝试的: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并在启动
- JSON转换(
)导致堆栈溢出异常JsonConvert.serializeObject()
- BinaryFormatter导致异常,表示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代码