Xamarin MVVM Android -方法被多次调用

y1aodyip  于 2023-01-22  发布在  Android
关注(0)|答案(1)|浏览(146)

**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方法就不起作用了(我必须关闭页面,然后再次打开它来刷新)。

dly7yett

dly7yett1#

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

相关问题