C# 反序列化listview的内容

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

我有一个包含ListViewItems的ListView。我有下面的代码来序列化我的列表视图,目前这只是用xaml创建了一个文件

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());
   });
}