您可以使用XamlReader
该类从文件中加载 Xaml,然后将 ListView 的内容设置为它。
虽然,这看起来像是一条死胡同,所以最好先序列化您用来填充 ListView 的数据(ItemsSource)。即 ViewModel / Model 如果使用 MVVM 模式。
MVVM 模式(模型视图 ViewModel)
由于 WPF 使用的绑定引擎,将 MVVM 模式与 WPF 结合使用是非常有用的。它还将 Display 逻辑与业务和数据逻辑分开,A View可以知道ViewModel,但ViewModel不知道View并且不应该具有指示View外观的逻辑。您还可以使用 MEF 等依赖注入框架来进一步解耦组件并帮助进行单元测试。
模型包含数据访问和状态的混合,因此您可以在保存和加载 ListView 项时序列化和反序列化模型。
ViewModel是View的抽象。您的应用程序可能只有一个模型,但有很多与之相关的视图。因此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 设计师一起工作,这将非常有用,因为他们可以在外观和感觉上工作,而不会过多地扰乱您在ViewModel和Model中的工作
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