如何解决如何最好地将嵌套模型连接到ViewModel?
我是WPF和MVVM的新手,目前存在以下问题,无法解决。
我有一个C#图片数据库库,其中的数据库大致如下所示:
class Database
{
List<Image> Images;
}
class Image
{
string Path;
Bitmap Thumbnail;
List<MetaEntry> MetaData;
}
class MetaEntry
{
string Key;
string Value;
}
现在,我想在XAML列表视图中显示此数据库。在这里我可以编辑元数据。因为我还有其他依赖库API的代码,所以我基本上必须将90%的数据结构复制到视图模型中,以便添加INotifyPropertyChanged
:
class ImageViewModel : INotifyPropertyChanged
{
// All members are hooked up to INotifyPropertyChanged
string Path;
Bitmap Thumbnail;
ObservableCollection<MetaEntryViewModel> MetaData;
}
class MetaEntryViewModel : INotifyPropertyChanged
{
// All members are hooked up to INotifyPropertyChanged
string Key;
string Value;
}
然后我可以使用这些视图模型来编写数据库查看器视图模型和XAML。
class Viewer : INotifyPropertyChanged
{
public ObservableCollection<ImageViewModel> Images; // Hooked up to Database.Images
public Image SelectedImage; // Notifies when changed
}
<StackPanel>
<Image Source="{Binding SelectedImage.Thumbnail,Converter={StaticResource ImageConverter}}" />
<ListBox ItemsSource="{Binding SelectedImage.MetaData}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Key}" />
<TextBox Text="{Binding Value}" />
</StackPanel>
</DataTemplate>
<ListBox.ItemTemplate>
</ListBox>
<ListBox ItemsSource="{Binding Images}"
SelectedItem="{Binding SelectedImage,UpdateSourceTrigger=PropertyChanged}">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Thumbnail,Converter={StaticResource ImageConverter}}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
(此处ImageConverter是一个帮助程序,它从文件中加载图像以显示它们。)
到目前为止,它可以很好地用作元数据查看器。但是,编辑是不可能的,因为我不得不以某种方式将所做的更改传播回数据库。实现反向传播并不十分困难,但是会导致我目前无法理解或解决的问题。
编写代码以将模型绑定到视图,然后再编写代码以将视图连接到模型似乎非常多余。此外,它导致大量重复的代码以及很多难以调试的边缘情况。特别是当您尝试将多个视图连接到同一模型时(例如,元数据过滤器)。有没有更简单的方法来完成所有这些工作?
我真的需要炸毁我的GUI代码,只是为了进行一些简单的数据库编辑吗?喜欢:
Database database = LoadFromFile();
database.Images[5].MetaData[3].Value = "new value";
database.Images.RemoveAt(7);
SaveToFile();
解决方法
如果您无法更改模型(Image
和MetaEntry
),则仍然需要创建视图模型的另一种方法是包装在视图模型中。根据显示的代码,您似乎正在将属性从模型复制到视图模型,但是当视图模型更改时,模型不会更改。如果我对问题的理解正确,那么您可以执行以下操作
class MetaEntryViewModel : INotifyPropertyChanged
{
// Assign this in the constructor
private readonly MetraEntry _metaEntry;
// All members are hooked up to INotifyPropertyChanged
public string Key
{
get => _metaEntry.Key;
set
{
_metaEntry.Key = value;
NotifyPropertyChanged(this,"Key");
}
}
// Other properties following the same pattern
}
虽然您仍然必须创建这些视图模型,但是当视图模型更改时,支持模型也会更改,因此可以保留这些支持模型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。