更改 CollectionView (Xamarin) 中的数据 UPD:新命令

问题描述

我使用 CollectionView 在屏幕上显示数据,但是当我更改数据时,UI 没有改变,尽管我使用的是 OnPropertyChanged代码如下:

Xaml

<CollectionView ItemsSource="{Binding GridData}" Margin="15">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="15" Padding="5">
                <Grid.RowDeFinitions>
                    <RowDeFinition Height="Auto" />
                    <RowDeFinition Height="Auto" />
                </Grid.RowDeFinitions>
                <Grid.ColumnDeFinitions>
                    <ColumnDeFinition Width="Auto" />
                    <ColumnDeFinition Width="*" />
                </Grid.ColumnDeFinitions>
                <Label Grid.Row="0"
                       Grid.Column="0"
                       HorizontalTextAlignment="Start"
                       Text="{Binding Title}"
                       FontSize="Small"/>
        <Label Grid.Row="0"
                       Grid.Column="1"
                       HorizontalTextAlignment="End"
                       Text="{Binding Data}"
                       TextColor="Black"
                       FontSize="Medium">
            <Label.GestureRecognizers>
                <TapGestureRecognizer
                        Command="{Binding Source={x:Reference Page},Path=BindingContext.TapCommand}"
                        CommandParameter="{Binding Title}" />
            </Label.GestureRecognizers>
        </Label>
        <BoxView Grid.Row="1"
                         Grid.Column="0"
                         Grid.ColumnSpan="2"                                                
                    BackgroundColor="LightGray"
                    CornerRadius="2"
                    HorizontalOptions="FillAndExpand" 
                    HeightRequest="1"></BoxView>
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

视图模型

private List<CollectionEntity> _gridData;
public List<CollectionEntity> GridData
{
    get => _gridData;
    set
    {
        if (_gridData != value)
        {
            _gridData = value;
            OnPropertyChanged(nameof(GridData));
        }
    }
}

public ICommand TapCommand
{
    get
    {
        return new Command<CollectionView>((commandParameters) =>
        {
            OpenEditing(commandParameters.ToString());
            OnPropertyChanged(nameof(GridData));
        });
    }
}

模型(与 viewmodel 在同一个文件中)

public class CollectionEntity: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
    }

    public string Title { get; set; }
    public string Data { get; set; }        
}

因此,当我点击标签时,UI 没有反应。我试着按照这个answer来写,但不明白,什么是不正确的。

UPD:新命令

public ICommand TapCommand => new Command<object>((commandParameters) =>
    {
        OpenEditing(commandParameters.ToString()); // changing data
    });

解决方法

虽然您在模型中编写了关于 INotifyPropertyChanged 的代码,但您没有在属性 TitleData 上实现它。修改代码如下

private string title;
public string Title
{
    get => title;
    set
    {
        if (title!= value)
        {
            title = value;
            OnPropertyChanged(nameof(Title));
        }
    }
}

private string data;
public string Data
{
    get => data;
    set
    {
        if (data!= value)
        {
            data= value;
            OnPropertyChanged(nameof(Data));
        }
    }
}

另外,TapCommand 中的代码似乎不会改变 source 的值。您可以将整个模型绑定到命令并根据需要在命令中设置标题或数据。

 CommandParameter="{Binding .}"
public ICommand TapCommand
{
    get
    {
        return new Command<CollectionView>((arg) =>
        {
            var model = arg as CollectionEntity;
             // model.Title = "xxx";
        });
    }
}