【发布时间】:2020-01-16 11:00:43
【问题描述】:
我已经编码 4 年多了...现在是时候我需要了解如何以完美的方式使用 MVVM,以便能够完成更困难的编码任务。
更具体地说,我想知道如何将模型对象用于多个视图模型和视图。
示例场景
让我们有一个有两个视图的应用程序:第一个包含ItemModel 对象列表(显示所有可用对象),另一个包含仅包含收藏夹的列表。
ItemModel 有一个 IsFavorite 布尔属性来确定它是否是一个。
直到今天,我总是这样完成这样的场景:
ItemModel类(同时是一个model-viewmodel类):
public class ItemModel : BaseBind // This class implements INotifyPropertyChanged
{
public ItemModel()
{
// ...
}
private bool isFavorite;
public Boolean IsFavorite
{
get { return isFavorite; }
set { SetProperty(ref isFavorite, value); OnPropertyChanged(); }
}
// All the model's and viewmodel's properties and functions are stored here...
public void GenericFunc()
{
App.Current.AppViewModel.GenericAppFunc(this);
}
public void FavoriteFunc()
{
App.Current.AppViewModel.FavoriteAppFunc(this);
}
public ItemModel Clone()
{
// Cloning the item with "new" constructor...
}
}
AppViewModel 类:
public class AppViewModel
{
public AppViewModel()
{
// Initializing...
}
public ObservableCollection<ItemModel> ItemsList { get; set; }
public ObservableCollection<ItemModel> FavoritesList { get; set; }
public void UpdateFavorites()
{
FavoritesList.Clear();
foreach (var it in ItemsList)
{
if (it.IsFavorite) FavoritesList.Add(it.Clone());
}
}
public void GenericAppFunc(ItemModel item)
{
// ...
}
public void FavoriteAppFunc(ItemModel item)
{
// ...
}
}
第一个视图,列出所有项目:
<ListView ItemsSource="{x:Bind ViewModel.ItemsList, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="vm:ItemModel">
<StackPanel>
<TextBlock Text="{x:Bind ItemTitle, Mode=OneWay}"/>
<Button Content="Generic func" Click="{x:Bind GenericFunc}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
第二个视图,只列出收藏夹:
<ListView ItemsSource="{x:Bind ViewModel.FavoritesList, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="vm:ItemModel">
<StackPanel>
<TextBlock Text="{x:Bind ItemTitle, Mode=OneWay}"/>
<Button Content="Favorite func" Click="{x:Bind FavoriteFunc}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这是我做这一切的方式...有两个完全独立的列表并在用户每次导航到收藏夹视图时克隆对象。
它有效,它总是这样做......但这绝对不是一个好的模式。
总而言之,这就是我目前正在做的事情......
...这就是我想要实现的目标:
为了有这样的轻量级模型...
public class ItemModel
{
public ItemModel()
{
// ...
}
public Boolean IsFavorite { get; set; }
// Only the model's properties and functions are stored here...
}
...并将其用于多个视图模型/视图。
最好的问候,感谢您的关注。
【问题讨论】:
-
您可以完全按照您在轻量级模型中编写的操作,但让我澄清一下,您是说您想在多个视图模型中使用/访问相同的项目列表吗?另外,为什么不在 ListView 上使用 item click 事件,这样就可以使用中继命令在 viewmodel 中移动事件处理程序?
标签: c# mvvm data-binding uwp