MvvmCross;如何从另一个ViewModel RaisePropertyChange

时间:2017-02-24 15:02:06

标签: c# android listview mvvm mvvmcross

我有一个 ShoppingCart listView 绑定 ShopingCartViewModel 。当我点击时,我会转到 ItemInfoFragment 绑定 ItemInfoViewModel

ItemInfoFragment 中,我有按钮删除 删除来自 ShoppingCart 列表视图

我的问题是;在我删除 后退按钮后返回之前 活动 ShoppingCart listView 仍然显示已删除的

我的问题是; 当我退出ItemInfoFragment时如何在ShoppingCartViewModel中RaisePropertyChange?

1 个答案:

答案 0 :(得分:1)

我相信你有几个选择:

共享永久存储空间

如果您使用SQLiteRealm等存储/缓存解决方案,则可以使用这些解决方案在页面之间读取和修改相同的购物车数据。然后,您可以使用视图生命周期事件(OnResume [Android]或ViewWillAppear [iOS])从缓存中检索最新内容。

或者,如果购物车数据量很小,您可以将其读/写到MvvmCross Settings Plugin。您只需序列化和反序列化对象,因为您只能保存基本类型,如字符串,bool,int等。

依赖注入共享实例

您可以使用可在多个ViewModel之间共享的共享类实例创建内存缓存。此类属性可以直接绑定到您的各种视图。对列表的任何更改都将更新绑定到它的所有视图。需要注意的一点是,如果需要此实例类占用的内存空间,则必须手动处理清理。

示例:

示例模型

public class ItemInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
}

共享类实例和接口

public interface ISharedShoppingCart
{
    MvxObservableCollection<ItemInfo> ShoppingCartItems { get; set; }
}

public class SharedShoppingCart : MvxNotifyPropertyChanged, ISharedShoppingCart
{
    MvxObservableCollection<ItemInfo> _shoppingCartItems;
    public MvxObservableCollection<ItemInfo> ShoppingCartItems
    {
        get { return _shoppingCartItems; }
        set { SetProperty(ref _shoppingCartItems, value); }
    }
}

确保注册课程和界面

public class App : MvxApplication
{
    public override void Initialize()
    {
        /* Other registerations*/

        Mvx.LazyConstructAndRegisterSingleton<ISharedShoppingCart, SharedShoppingCart>();
    }
}

共享ViewModels中的示例用法

public class ShopingCartViewModel : MvxViewModel
{
    readonly ISharedShoppingCart _sharedShoppingChart;

    public ShopingCartViewModel(ISharedShoppingCart sharedShoppingChart)
    {
        _sharedShoppingChart = sharedShoppingChart;
    }

    public MvxObservableCollection<ItemInfo> ShoppingCartItems
    {
        get { return _sharedShoppingChart.ShoppingCartItems; }
        set { _sharedShoppingChart.ShoppingCartItems = value; }
    }
}

public class ItemInfoViewModel : MvxViewModel
{
    readonly ISharedShoppingCart _sharedShoppingCart;

    public ItemInfoViewModel(ISharedShoppingCart sharedShoppingCart)
    {
        _sharedShoppingCart = sharedShoppingCart;
    }

    void RemoveItemFromCart(int id)
    {
        _sharedShoppingCart.ShoppingCartItems
            .Remove(_sharedShoppingCart.ShoppingCartItems.Single(x => x.Id == id));
    }
}

<强>发布/订阅

您可以使用messagesMvvmCross Messenger Plugin发送回购物车ViewModel。