如何解决为 ObservableCollection 扩展提供一些列表是一种好习惯吗?
我正在使用 MVVM 模式用 C# 编写应用程序。
我的问题:在我的模型中,我有一些扩展 ObservableCollection 的集合。将三个列表放在模型中的 ObservableCollection 之一中是一种好习惯吗?或者我应该如何实现它?
假设我有一本带有属性的书。这些书籍都分为两类(现实和虚构)。所以我会创建三个模型:
-
预订
-
BookCollection : ObservableCollection 列表小说 = new Listy(); 列表现实= new Listy();
-
BookCollectionCollection : ObservableCollection
解决方法
简短回答:我认为您的模型中不应该有任何 ObservableCollections。模型应该都是简单的类,需要最少的结构完整性,例如字符串、整数,最多是书籍集合的 List
长答案: MVVM 模式的关键是知道如何正确创建“关注点分离”。这意味着,了解您的模型,您希望这些模型如何在 UI 上显示/表现(即视图模型),以及您希望这些模型在 UI 上的外观(即视图)。
你的模型是什么?
根据您最初的问题和描述,我认为您只有两种模型:
- 书(有一个名字,可能是一个 ID,一个 BookType 枚举器,如小说/现实/等......)
- 书店(有一个名称和一个列表来代表他们的整个图书收藏,无论是虚构的/现实的/等等。)
您的 ViewModel 是什么?
- BookViewModel。您希望从 Book 模型公开哪些属性?也许它的所有属性,如 Name、ID 和 BookType。或者您可能只想公开 Name 和 BookType。这就是使用此 ViewModel 保护模型免遭直接访问或操作的方法。
- 书店视图模型。这个视图模型的模型将是一个书店。但是您向 UI 公开的内容应该是:
- 字符串名称(商店名称)
- ObservableCollection
Books(商店的藏书)
您的观点是什么?
- 书店视图。这可能是一个包含商店名称文本框的控件,也可能是他们的小说书籍的列表视图和他们的现实书籍的另一个列表视图。
部分代码示例:考虑这个伪代码,而不是一个可编译的示例。
型号:
public enum BookType
{
Fiction,Reality,Other
}
public class Book
{
public string ID { get; set; }
public string Name { get; set; }
public BookType BookType { get; set; }
}
public class Bookstore
{
public string Name { get; set; }
public List<Book> Books { get; set; }
}
视图模型:
// Note: This view model may seem redundant and unnecessary,and 99% of the time it is.
// But by having this ViewModel,you can protect your Book model from direct manipulation,// or make some properties read-only,etc. I'm not doing it here,but I'm saying you could.
public class BookViewModel : INotifyPropertyChanged
{
public Book Model { get; private set; }
public BookViewModel(Book model)
{
Model = model;
}
public string Name { get => Model.Name; set { Model.Name = value; OnPropertyChanged(); }
public string BookType { get => Model.BookType; set { Model.BookType = value; OnPropertyChanged(); }
}
public class BookstoreViewModel: INotifyPropertyChanged
{
private ObservableCollection<BookViewModel> books = new ObservableCollection<BookViewModel>();
public BookstoreViewModel(Bookstore model)
{
Model = model;
foreach (var book in Model.Books)
{
books.Add(book);
}
}
public ObservableCollection<BookViewModel> FictionBooks
{
get => books.Where(b => b.BookType == BookType.Fiction);
}
public ObservableCollection<BookViewModel> RealityBooks
{
get => books.Where(b => b.BookType == BookType.Reality);
}
public ObservableCollection<BookViewModel> OtherBooks
{
get => books.Where(b => b.BookType == BookType.Other);
}
}
视图:这是一个用户控件的 WPF 示例,用于显示有关书店及其书籍的详细信息。
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<ListBox ItemsSource="{Binding FictionBooks}"/>
<ListBox ItemsSource="{Binding RealityBooks}"/>
</StackPanel>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。