**EDIT:**似乎仅当列表中至少有一个选中的复选框时才会出现此问题。
我正在使用Xamarin与MVVM,我有一个产品的集合视图和一个复选框。我有一个实现INotifyPropertyChanged的产品列表。通过使用EventToCommandBehavior,我在选中复选框时调用命令,将对象绑定为CommandParameter。此命令调用名为CheckPrice的方法。此方法检查对象的Found属性是否为true,如果满足条件则继续(复选框的IsChecked绑定到对象的Checked属性),检查完成后,更新对象,然后调用方法RefreshList,该方法使列表从数据库接收新列表。
问题是,每次更新列表(通过RefreshList方法)并调用List集的Notify()方法时,都会多次调用CheckPrice方法,直到我单击DisplayPrompt上的cancel。
每当我刷新ItemsSource(视图模型上的Products列表)时,就会出现这种情况。
查看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>
视图模型
充当CollectionView的ItemsSource的产品列表
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而不是List实现INotifyPropertyChanged,这解决了问题,但这样我的RefreshList方法就不起作用了(我必须关闭页面,然后再次打开它来刷新)。
1条答案
按热度按时间dly7yett1#
当我删除或添加任何内容时,原始代码会更新整个列表,所以没有通知。现在我使用ObservableCollection而不替换整个列表。