C# UWP应用程序中的高级MVVM场景-如何为多个viewmodels使用模型类?
我已经编码超过4年了。。。现在我需要了解如何完美地使用MVVM,以便能够完成更困难的编码任务 更具体地说,我想知道如何将模型对象用于多个viewmodels和View 示例场景 让我们来看一个有两个视图的应用程序:第一个是C# UWP应用程序中的高级MVVM场景-如何为多个viewmodels使用模型类?,c#,mvvm,data-binding,uwp,C#,Mvvm,Data Binding,Uwp,我已经编码超过4年了。。。现在我需要了解如何完美地使用MVVM,以便能够完成更困难的编码任务 更具体地说,我想知道如何将模型对象用于多个viewmodels和View 示例场景 让我们来看一个有两个视图的应用程序:第一个是ItemModel对象列表(显示所有可用对象),另一个是仅包含收藏夹对象的列表。 ItemModel有一个IsFavorite布尔属性来确定它是否是一个 直到今天,我一直以这种方式完成这样的场景: ItemModel类(同时是一个模型视图模型类): AppViewModel类:
ItemModel
对象列表(显示所有可用对象),另一个是仅包含收藏夹对象的列表。
ItemModel
有一个IsFavorite布尔属性来确定它是否是一个
直到今天,我一直以这种方式完成这样的场景:
ItemModel类(同时是一个模型视图模型类):
AppViewModel类:
…并将其用于多个视图模型/视图
向您致意并感谢您的关注。在UWP中,在单个数据源上没有数据过滤。虽然在WPF中,可以使用相同的
ObservableCollection
项并仅在使用绑定视图时进行筛选,但似乎唯一的解决方案就是您正在做的事情
确实,在UWP的CollectionViewSource类中没有Filter属性,因此[…]您必须过滤源集合本身(或者像您已经在做的那样使用两个不同的集合)
当然,您可以通过挂接项目的PropertyChanged
事件,并在设置项目的IsFavorite
属性时将其从一个集合移动到另一个集合,从而消除调用UpdateFavorites()
的需要,如下所示:
public-AppViewModel()
{
//订阅项集合中的更改
ItemsList.CollectionChanged+=ItemList\u CollectionChanged;
}
私有void ItemList\u CollectionChanged(对象发送方,事件参数e){
//此处订阅/取消订阅每个项目的PropertyChanged事件
//当他们来来去去的时候
}
私有无效项\u属性已更改(对象发送方,事件参数e){
//在此处选中IsFavorite属性并从收藏夹列表中添加/删除该项。
//您甚至可以实例化另一种特定于收藏夹项的viewmodel对象。
}
关于MVVM模式,我建议像您建议的那样使用轻量级
ItemModel
模型,并将它们的集合存储在您的模型中。然后,您可以有两个集合,一个集合具有ItemViewMode
对象,另一个集合具有AppViewModel
中的FavoriteItemViewModel
对象。您还可以使用一个带有IsFavorite
属性的ItemViewModel
类,并使用触发器和样式使它们以不同的方式显示。我看不到克隆的理由
以下方面会有什么问题:
foreach (var it in ItemsList)
{
//if (it.IsFavorite) FavoritesList.Add(it.Clone());
if (it.IsFavorite) FavoritesList.Add(it);
}
或者,只需将FavoritesList设置为筛选版本:
public List<Item> FavoritesList => ItemsList.Where(x => x.IsFavorit);
publicslist-FavoritesList=>ItemsList.Where(x=>x.IsFavorit);
只要您以正确的方式通知,这应该会起作用。您可以完全按照在轻量级模型中编写的方式进行操作,但让我澄清一下,您是说您希望在多个viewModels中使用/访问相同的项目列表吗?另外,为什么不在ListView上使用item click事件,以便可以使用中继命令在viewmodel中移动事件处理程序?
<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...
}
foreach (var it in ItemsList)
{
//if (it.IsFavorite) FavoritesList.Add(it.Clone());
if (it.IsFavorite) FavoritesList.Add(it);
}
public List<Item> FavoritesList => ItemsList.Where(x => x.IsFavorit);