CollectionView 中的 Xamarin 更新数据不起作用

问题描述

我的页面中有一个 CollectionView 和一个与类绑定的标签名称

λ> :kind Whatever
Whatever :: * -> *
λ> :kind Something
Something :: Constraint -> *

然后我有一个类市场

<CollectionView Grid.Column="0"
                    Grid.Row="1"
                    SelectionMode="Single"
                    ItemsSource="{Binding MarketplacePackages}">

            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout Orientation="Vertical">
                        <Label Text="{Binding Name}" />
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

在我的 viewmodel 中,我有

一个列表视图

public class MarketplacePackage
{
    public string Name { get; set; }
}

用于初始化列表的构造函数

List<MarketplacePackage> marketplacePackages;
    public List<MarketplacePackage> MarketplacePackages
    {
        get { return marketplacePackages; }
        set { SetProperty(ref marketplacePackages,value); }
    }

当我调用 onClickMethod 时,我尝试更改 listView 中的数据

public Marketplaceviewmodel()
    {
        Catalogue = new Command(onCatalogueClicked);
        MyDevice = new Command(onMyDeviceClicked);
        MyOrders = new Command(onMyOrderdsClicked);

        MarketplacePackages = new List<MarketplacePackage>() {
            new MarketplacePackage()
            {
                Name = catalogueList[0],},new MarketplacePackage()
            {
                Name = catalogueList[1]
            },new MarketplacePackage()
            {
                Name = catalogueList[2]
            },new MarketplacePackage()
            {
                Name = catalogueList[3]
            }
        };

        //this works!
        //MarketplacePackages[0].Name = "String";
    }

解决方法

您的 MarketplacePackage 类必须实现 INotifyPropertyChanged 接口(或者如果您使用 XamarinCommunityToolkit 或 MvvmHelpers,则从 ObservableObject 继承)并在 Name 属性为改变了。

例如:

public class MarketplacePackage : ObservableObject
{
    string name;
    public string Name { get => name; set => SetProperty(ref name,value); }
}

当您在 ViewModel 的构造函数中设置/更改 Name 属性时它会起作用,因为 View 在构造函数完成后读取初始值。