xamarin 更新ObservableCollection的对象未在UI中反映

6mw9ycah  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(142)

我正在将ObservableCollection与集合视图绑定。

<CollectionView ItemsSource="{Binding LeftExercises}">
                                    <CollectionView.ItemTemplate>
                                        <DataTemplate x:DataType="models:ExerciseModel">
                                            <Grid>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="50"/>
                                                </Grid.RowDefinitions>
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="3*" />
                                                    <ColumnDefinition Width="4*" />
                                                    <ColumnDefinition Width="4*" />
                                                </Grid.ColumnDefinitions>
                                                <Label Grid.Column="0" Grid.Row="0" Text="{Binding SetNumber}" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" TextColor="Black" FontSize="Medium" />
                                                <Label Grid.Column="1" Grid.Row="0" Text="{Binding Weight}" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" TextColor="Black" FontSize="Medium" />
                                                <Label Grid.Column="2" Grid.Row="0" Text="{Binding Reps}" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" TextColor="Black" FontSize="Medium" />
                                            </Grid>
                                        </DataTemplate>
                                    </CollectionView.ItemTemplate>
                                </CollectionView>

private ObservableCollection<ExerciseModel> _leftExercises;
        public ObservableCollection<ExerciseModel> LeftExercises
        {
            get => _leftExercises;
            set
            {
                if (_leftExercises != value)
                {
                    _leftExercises = value;
                    OnPropertyChanged(nameof(LeftExercises));
                }
            }
        }

当我向集合添加新对象时,它将反映在UI中,但每当我尝试更新任何对象的值时,它都不会反映。
这是我的模特

public class ExerciseModel
    {
        public int SetNumber { get; set; }
        public decimal Weight { get; set; }  
        public int Reps { get; set; } 
        public ExerciseType ExerciseType { get; set; }
        public Side Side { get; set; }
    }

我正在通过以下命令增加Reps(更新Reps属性)。

private Command _dummyLeftIncreaseRepsCommand;
        public Command dummyLeftIncreaseRepsCommand
        {
            get
            {
                return _dummyLeftIncreaseRepsCommand ??= new Command(() =>
                {
                    ExerciseModel lastObj = LeftExercises.Last(x => x.Side == SharedVM.ActiveSide);
                    lastObj.Reps += 1;
                });
            }
        }
von4xj4u

von4xj4u1#

您的ExerciseModel类需要实现INotifyPropertyChanged
为此,只需将接口名称添加到类代码中,如下所示:

class MyClass : INotifyPropertyChanged

或者,您可以再次设定对象的ItemsSource。这样做也会更新视觉化对象。您可以在执行阶段这样做:
XAML文件:

<CollectionView x:Name="MyView">[...]

背景程式码:

MyView.ItemsSource = MyCollectionVar;
1u4esq0p

1u4esq0p2#

我建议您在尝试将命令、可观察属性和集合绑定到XAML时使用CommunityToolkit.MVVM和CommunityToolkit.MAUI。
这样做的好处是,您不必编写代码墙,并花几个小时来找出为什么它不工作。
它节省了您的时间,您可以放入一些有用的东西,而不是处理样板代码。

相关问题