我有一个 ShoppingCart listView , 绑定 ShopingCartViewModel 。当我点击到项时,我会转到 ItemInfoFragment 绑定到 ItemInfoViewModel 。
在 ItemInfoFragment 中,我有按钮,删除 项,删除来自 ShoppingCart 列表视图。
我的问题是;在我删除 项和按 后退按钮后返回之前 活动, ShoppingCart listView 仍然显示我已删除的项 。
我的问题是; 当我退出ItemInfoFragment时如何在ShoppingCartViewModel中RaisePropertyChange?
答案 0 :(得分:1)
我相信你有几个选择:
共享永久存储空间
如果您使用SQLite或Realm等存储/缓存解决方案,则可以使用这些解决方案在页面之间读取和修改相同的购物车数据。然后,您可以使用视图生命周期事件(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));
}
}
<强>发布/订阅强>
您可以使用messages将MvvmCross Messenger Plugin发送回购物车ViewModel。