【问题标题】:Xamarin Update data inside CollectionView doesn't workCollectionView 中的 Xamarin 更新数据不起作用
【发布时间】:2021-04-19 17:00:30
【问题描述】:

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

<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>

然后我有一个类市场

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

在我的 ViewModel 中我有这个

一个列表视图

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

我初始化列表的构造函数

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";
    }

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

private async void onCatalogueClicked()
    {
        MarketplacePackages[0].Name = "String";
    }

【问题讨论】:

  • MarketplacePackage 需要实现 INotifyPropertyChanged - 这是在属性更新时通知 UI 的机制

标签: xamarin collectionview


【解决方案1】:

您的 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 在构造函数完成后读取初始值。

【讨论】:

  • 我将 BaseViewModel 用于我的 MarketplaceViewModel 类,该类已经扩展了 INotifyPropertyChanged
  • 是的,但在您的代码中,Name 属性不会在值更改时发出通知。
  • 您需要确保MarketplaceViewModelMarketplacePackage 都实现INotifyPropertyChanged
  • 我尝试了但没有改变public class MarketplacePackage : INotifyPropertyChanged { public string Name { get; set; } public event PropertyChangedEventHandler PropertyChanged; }
  • 请看一下这个例子(属性如何引发事件):docs.microsoft.com/en-us/dotnet/desktop/winforms/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多