C# 反序列化listview的内容
我有一个包含ListViewItems的ListView。我有下面的代码来序列化我的列表视图,目前这只是用xaml创建了一个文件C# 反序列化listview的内容,c#,wpf,deserialization,C#,Wpf,Deserialization,我有一个包含ListViewItems的ListView。我有下面的代码来序列化我的列表视图,目前这只是用xaml创建了一个文件 private void SerializeToXML() { FileStream filestream = File.Create(@"H:\test1.xaml"); StreamWriter streamwriter = new StreamWriter(filestream); foreach (ListViewItem Item
private void SerializeToXML()
{
FileStream filestream = File.Create(@"H:\test1.xaml");
StreamWriter streamwriter = new StreamWriter(filestream);
foreach (ListViewItem Item in slideListView.Items)
{
string mystrXAMLWrite = XamlWriter.Save(Item.Tag);
streamwriter.Write(mystrXAMLWrite);
}
streamwriter.Close();
filestream.Close();
}
我遇到的问题是将此文件的内容反序列化到ListView中
谁能解释一下我会怎么做
到目前为止,对于反序列化方法,我有:
private void DeSerialize()
{
FileStream filestream = File.Open(@"H:\test1.xaml", FileMode.Open);
XamlReader reader = new XamlReader();
reader.LoadAsync(filestream);
}
可以使用该类从文件中加载Xaml,然后将ListView的内容设置为该类
尽管如此,这看起来像一条死胡同,因此最好首先序列化用于填充ListView的数据(ItemsSource)。i、 e.视图模型/模型(如果使用MVVM模式)
MVVM模式(模型视图视图模型)
由于WPF使用的绑定引擎,将MVVM模式与WPF结合使用非常有用。
它还将显示逻辑与业务逻辑和数据逻辑分开,视图可以了解视图模型,但视图模型不了解视图,并且不应具有决定视图外观的逻辑。您还可以使用依赖项注入框架(如MEF)来进一步分离组件之间的耦合,并帮助进行单元测试
模型包含数据访问和状态的混合,因此在保存和加载ListView项时,您可以序列化和反序列化模型
视图模型是视图的抽象。您的应用程序可能只有一个模型,但有大量与之相关的视图。因此,ViewModel将包含您希望在当前视图中与模型进行交互的任何相关属性
最后,视图显示视图模型
那么这意味着什么呢
我们最终得到了两个类和一个xaml窗口/页面/用户控件
我将提供一些接口作为指导
public interface IMyData : INotifyPropertyChanged
{
Properties...
}
public interface IMyModel
{
IList<IMyData> Items { get; set; }
void Serialize(string filePath);
void Deserialize(string filePath);
}
public interface IMyViewModel : INotifyPropertyChanged
{
IMyModel Model { get; set; }
ObservableCollection<IMyData> Items { get; set; }
ICommand Save { get; }
ICommand Load { get; }
ICommand Add { get; }
ICommand Remove { get; }
}
然后我们可以将最低的UI元素DataContext设置为ViewModel,例如,您可能希望使用网格作为基本UI元素
<Grid DataContext="{StaticResource ViewModel}">
...
</Grid>
假设您想通过按按钮
向收藏中添加新项目
Xaml标记如下所示:
<Button Command="{Binding Add}">Add</Button>
由于我们使用的是observateCollection
,UI将被更新,但您需要调用UI线程,因为它必须在创建它的线程上进行修改
我已经在我的原始帖子中添加了一些代码,但我是否可以将内容设置为listview。我不明白你的第二点,你能详细说明一下吗。。我拥有的ListView在运行时由用户使用ListViewItems填充。ListViewItems由内容和标记组成。内容是一些文本和图像,但标记是一个自定义用户控件。我不太了解MVVM,但在这种情况下它会工作吗?WPF应用程序通常是使用模型-视图-模型模式创建的,如果使用现有的框架(如MVVMLight)会更容易。我会用一个样本更新我的答案。
<ListView ItemsSource="{Binding Items}">
<ListView.ItemsTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Property1}" />
</StackPanel>
<DataTemplate>
</ListView.ItemsTemplate>
</ListView>
<Button Command="{Binding Add}">Add</Button>
public MyViewModelImplementation()
{
Add = new RelayCommand(AddItem);
}
private void AddItem()
{
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Items.Add(new MyData());
});
}