Xamarin MVVM Android-方法被调用多次



编辑: 只有当列表中至少有一个复选框被选中时,问题才会出现

我在MVVM中使用Xamarin,我有一个产品集合视图和一个复选框。我有一个实现INotifyPropertyChanged的产品列表。通过使用EventToCommandBehavior,我在选中复选框时调用命令,将对象绑定为CommandParameter。此命令调用一个名为CheckPrice的方法。此方法检查对象的Found属性是否为true,并在满足条件时继续(复选框的IsChecked绑定到对象的Checked属性)。在该检查之后,更新对象,然后调用方法RefreshList,该方法使列表从数据库接收新列表。

问题是,每次更新列表(通过RefreshList方法)并调用list集的Notify()方法时,都会多次调用CheckPrice方法,直到我在DisplayPrompt上单击cancel。

每次刷新ItemsSource(视图模型上的"产品"列表)时,都会出现这种情况。


查看XAML

查看上的CollectionView

<CollectionView ItemsSource="{Binding Products}" x:Name="List">
<CollectionView.ItemTemplate>
<DataTemplate>
<CheckBox  Margin="0,-21,0,0" IsChecked="{Binding Found}">
<CheckBox.Behaviors CachingStrategy="RetainElement">
<xct:EventToCommandBehavior                                                            
EventName="PropertyChanged"
Command="{Binding BindingContext.CheckPrice, Source={x:Reference List}" 
CommandParameter="{Binding .}" />
</CheckBox.Behaviors>
</CheckBox>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>

ViewModel

作为CollectionView 的项目源的产品列表

public List<Product> Products
{
get { return produtos; }
set { produtos = value; Notify(); }
}


CheckPrice命令正在调用的方法

private async void UpdatePrice(Product product)
{
var str = await App.Current.MainPage.DisplayPromptAsync("Product Found!", "Type the price", "Save", "Cancel", keyboard: Keyboard.Numeric);
if (str != null)
{
product.Price = Decimal.Parse(str);
App._productRepo.UpdateProduct(product);
RefreshProd();
}
}


RefreshList方法,每当我添加或删除某个东西时都会调用它(也在视图模型的构造函数上调用)

public void RefreshList()
{
this.Products = App._productRepo.GetProducts();
}           

在很多事情中,我尝试使用ObservableCollection而不是实现INotifyPropertyChanged的List,这解决了问题,但这样我的RefreshList方法就不起作用了(我必须关闭页面,然后再次打开它进行刷新)。

当我删除或添加任何内容时,原始代码正在更新整个列表,因此没有通知。现在我使用ObservableCollection而不替换整个列表。

最新更新