C# UWP应用程序中的高级MVVM场景-如何为多个viewmodels使用模型类?

C# UWP应用程序中的高级MVVM场景-如何为多个viewmodels使用模型类?,c#,mvvm,data-binding,uwp,C#,Mvvm,Data Binding,Uwp,我已经编码超过4年了。。。现在我需要了解如何完美地使用MVVM,以便能够完成更困难的编码任务 更具体地说,我想知道如何将模型对象用于多个viewmodels和View 示例场景 让我们来看一个有两个视图的应用程序:第一个是ItemModel对象列表(显示所有可用对象),另一个是仅包含收藏夹对象的列表。 ItemModel有一个IsFavorite布尔属性来确定它是否是一个 直到今天,我一直以这种方式完成这样的场景: ItemModel类(同时是一个模型视图模型类): AppViewModel类:

我已经编码超过4年了。。。现在我需要了解如何完美地使用MVVM,以便能够完成更困难的编码任务

更具体地说,我想知道如何将模型对象用于多个viewmodels和View

示例场景 让我们来看一个有两个视图的应用程序:第一个是
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);