正如我所见,您正在尝试使用 MVVM 作为 Xamarin.Forms 应用程序的模式。您已经在使用ObservableCollection 来显示数据列表。当从集合中添加或删除新项目时,UI 将相应刷新,这是因为 ObserverbleCollection 正在实现 INotifyCollectionChanged。
您想要通过这个问题实现的是下一个行为,当您想要更改集合中项目的特定值并更新 UI 时,实现这一目标的最佳和最简单的方法是为模型实现 INotifyPropertyChanged您收藏中的项目。
下面,我有一个简单的演示示例说明如何实现这一点,您的答案正如我所见,但我相信这个示例更适合您使用。
我有简单的Button 和命令,ListView 保存我的收集数据。
这是我的页面,SimpleMvvmExamplePage.xaml:
<StackLayout>
<Button Text="Set status"
Command="{Binding SetStatusCommand}"
Margin="6"/>
<ListView ItemsSource="{Binding Cars}"
HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Vertical"
Margin="8">
<Label Text="{Binding Name}"
FontAttributes="Bold" />
<StackLayout Orientation="Horizontal">
<Label Text="Seen?"
VerticalOptions="Center"/>
<CheckBox IsChecked="{Binding Seen}"
Margin="8,0,0,0"
VerticalOptions="Center"
IsEnabled="False" />
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
此演示的基本思想是更改属性Seen 的值,并在用户单击ListView 上方的按钮时为CheckBox 设置值。
这是我的Car.cs 课程。
public class Car : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged();
}
}
private bool seen;
public bool Seen
{
get { return seen; }
set
{
seen = value;
OnPropertyChanged();
}
}
// Make base class for this logic, something like BindableBase
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
在我的 Github 上的完整演示示例中,我正在使用我的 BindableBase 类,当在 props 的 setter 中使用此 SetProperty 方法更改某些属性值时,我会处理提升 INotifyPropertyChanged。
你可以找到实现here:https://github.com/almirvuk/Theatrum/tree/master/Theatrum.Mobile/Theatrum.Mobile
最后要显示的是这个页面的ViewModel,在ViewModel 内部,当用户点击Button 高于 ListView。这是我的SimpleMvvmExamplePageViewModel.cs
public class SimpleMvvmExamplePageViewModel
{
public ObservableCollection<Car> Cars { get; set; }
public ICommand SetStatusCommand { get; private set; }
public SimpleMvvmExamplePageViewModel()
{
// Set simple dummy data for our ObservableCollection of Cars
Cars = new ObservableCollection<Car>()
{
new Car()
{
Name = "Audi R8",
Seen = false
},
new Car()
{
Name = "BMW M5",
Seen = false
},
new Car()
{
Name = "Ferrari 430 Scuderia",
Seen = false
},
new Car()
{
Name = "Lamborghini Veneno",
Seen = false
},
new Car()
{
Name = "Mercedes-AMG GT R",
Seen = false
}
};
SetStatusCommand = new Command(SetStatus);
}
private void SetStatus()
{
Car selectedCar = Cars.Where(c => c.Seen == false)
.FirstOrDefault();
if (selectedCar != null)
{
// Change the value and update UI automatically
selectedCar.Seen = true;
}
}
}
这段代码将帮助我们实现这种行为:当用户点击Button时,我们将从集合中更改项目属性的值,并且UI将被刷新,复选框值将被选中。
这个演示的最终结果可以在下面这个 gif 中看到。
附注我可以将它与来自ListView 的ItemTapped 事件结合起来,但我想让它变得非常简单,所以这个例子是这样的。
希望这对您有所帮助,祝您编码顺利!