这是我的第一篇文章,所以请耐心等待。
我正在使用Xamarin表单。
我正在尝试更新购物车样式ObservableCollection。我的XAML文件具有一个按钮,该按钮在以下代码中执行命令“ AddCommand”。我知道这行得通,因为Basket ObservableCollection更新(获取对象后与DisplayAlert进行了检查)。我知道OnPropertyChanged()被调用是因为我在其中放置了一个断点并对其进行了标记。
我的问题是,添加后UI不会更新。如果我添加对象时以这些负载开始,则仅显示使用AddToBasket函数添加的对象。
BasketViewModel.cs:
namespace SacredGrounds.ViewModel
{
public class BasketViewModel : ViewModelBase
{
ObservableCollection<BasketItem> _Basket;
public ObservableCollection<BasketItem> Basket
{
get { return _Basket; }
set
{
_Basket = value;
OnPropertyChanged();
}
}
public BasketViewModel()
{
Basket = new ObservableCollection<BasketItem>();
}
public ICommand AddCommand => new Command(AddToBasket);
private async void AddToBasket()
{
Basket.Add(new BasketItem { BasketItemType = BasketItemType.Drink,ProductName = "Test",ProductImage = "coffeeBeans.png",UnitPrice = 2,Quantity = 1 });
await NavigationService.Instance.SwitchToDrinks();
}
}
ViewModelBase.cs
using System.Threading.Tasks;
using Xamarin.Forms;
namespace SacredGrounds.ViewModel.Base
{
public class ViewModelBase : BindableObject
{
public virtual Task InitializeAsync(object navigationData) => Task.FromResult(false);
}
}
CartPopupView.Xaml的相关部分
</pancake:PancakeView>
<Grid
Grid.Row="1"
BackgroundColor="{StaticResource GreenColor}">
<Grid.RowDefinitions>
<RowDefinition Height="250" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- BASKET ITEMS -->
<ListView
x:Name="listView1"
Grid.Row="0"
ItemsSource="{Binding Basket}"
ItemTemplate="{StaticResource BasketItemDataTemplateSelector}"
HasUnevenRows="True"
SeparatorVisibility="Default"
Selectionmode="None"
ItemTapped="RemoveItem"
Margin="0,6"/>
CartPopupView.Xaml.cs的相关部分
namespace SacredGrounds.Views
{
public partial class CartPopupView : ContentView
{
public delegate void TapDelegate();
public CartPopupView ()
{
InitializeComponent ();
GoToState("Collapsed");
}
有人可以建议我为什么我的UI没有从此代码更新吗?
编辑: 感谢Jason为实现我的错误提供的帮助。
我正在为每个页面创建一个类BasketViewModel的新实例,因此,根据所访问的实例,Observable集合中的项目明显不同。我处理此问题的方法是添加一个在页面之间传递的静态实例。
BasketViewModel.cs
namespace SacredGrounds.ViewModel
{
public class BasketViewModel : ViewModelBase
{
public static BasketViewModel _instance;
public static BasketViewModel Instance
{
get
{
if (_instance == null)
_instance = new BasketViewModel();
return _instance;
}
}
ObservableCollection<BasketItem> _Basket;
public ObservableCollection<BasketItem> Basket
{
get { return _Basket; }
set
{
_Basket = value;
OnPropertyChanged();
}
}
public BasketViewModel()
{
Basket = new ObservableCollection<BasketItem>();
}