0

我有一个包含 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);
}
4

1 回答 1

1

您可以使用XamlReader该类从文件中加载 Xaml,然后将 ListView 的内容设置为它。

虽然,这看起来像是一条死胡同,所以最好先序列化您用来填充 ListView 的数据(ItemsSource)。即 ViewModel / Model 如果使用 MVVM 模式。

MVVM 模式(模型视图 ViewModel)

由于 WPF 使用的绑定引擎,将 MVVM 模式与 WPF 结合使用是非常有用的。它还将 Display 逻辑与业务和数据逻辑分开,A View可以知道ViewModel,但ViewModel不知道View并且不应该具有指示View外观的逻辑。您还可以使用 MEF 等依赖注入框架来进一步解耦组件并帮助进行单元测试。

模型包含数据访问和状态的混合,因此您可以在保存和加载 ListView 项时序列化和反序列化模型。

ViewModelView的抽象。您的应用程序可能只有一个模型,但有很多与之相关的视图。因此ViewModel将包含您希望模型与当前视图交互的任何相关属性

最后View显示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; }
}

视图可以完全在 Xaml 中完成,如果您与 UI 设计师一起工作,这将非常有用,因为他们可以在外观和感觉上工作,而不会过多地扰乱您在ViewModelModel中的工作

Xaml用于DataTemplates描述 UI 元素应如何显示其DataContext.

视图中,我们可以将ViewModel添加为资源。

<Window xmlns:vm="clr-namespace:MyApp.MyViewModels">
   <Window.Resources>
      <vm:MyViewModelImplementation x:Key="ViewModel" />
   </Window.Resources>
...

然后我们可以将最低的 UI 元素 DataContext 设置为 ViewModel,例如您可能希望使用网格作为基本 ui 元素。

<Grid DataContext="{StaticResource ViewModel}">
   ...
</Grid>

现在,当我们显示ListView项目时,ListView将看起来像这样。

<ListView ItemsSource="{Binding Items}">
   <ListView.ItemsTemplate>
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Property1}" />
         </StackPanel>
      <DataTemplate>
   </ListView.ItemsTemplate>
</ListView>

假设您希望能够通过按 a 将新项目添加到您的收藏中Button

Xaml 标记如下所示:

<Button Command="{Binding Add}">Add</Button>

ViewModel中的 Command 属性就是这个。

public MyViewModelImplementation()
{
   Add = new RelayCommand(AddItem);
}

private void AddItem()
{
   DispatcherHelper.CheckBeginInvokeOnUI(() =>
   {
      Items.Add(new MyData());
   });
}

由于我们使用的ObservableCollection<T>是 UI 将被更新,但您需要调用 UI 线程,因为它必须在创建它的线程上进行修改。

MVVM 维基文章 MVVMLight

于 2013-07-25T11:29:03.797 回答