我正在将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;
});
}
}
2条答案
按热度按时间von4xj4u1#
您的
ExerciseModel
类需要实现INotifyPropertyChanged
。为此,只需将接口名称添加到类代码中,如下所示:
或者,您可以再次设定对象的
ItemsSource
。这样做也会更新视觉化对象。您可以在执行阶段这样做:XAML文件:
背景程式码:
1u4esq0p2#
我建议您在尝试将命令、可观察属性和集合绑定到XAML时使用CommunityToolkit.MVVM和CommunityToolkit.MAUI。
这样做的好处是,您不必编写代码墙,并花几个小时来找出为什么它不工作。
它节省了您的时间,您可以放入一些有用的东西,而不是处理样板代码。