选项 1:在 ViewModel 中使用属性设置器
如果您使用 MVVM - 解决此问题的最简单选项是使用属性设置器 来检测值更新(如 link 中所述)。但是如果你想在这里调用可等待的方法,这个选项不起作用。此外,作为最佳实践,建议属性不应实现any time consuming operations。
bool _isToggled;
public bool IsToggled
{
get
{
return _isToggled;
}
set
{
_isToggled = value;
// Add your update code here
}
}
选项 2:在 ViewModel 中使用 PropertyChanged 事件
下一个选项是在您的视图模型中订阅PropertyChanged 事件并适当地处理它。这允许您定义异步处理程序,这些处理程序反过来可以等待异步方法。
// Subscribe to event while constructing/assigning viewmodel
// viewCellVM.PropertyChanged += CategoryVM_PropertyChanged;
async void ViewCellVM_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if(e.PropertyName == nameof(ViewCellVM.IsToggled))
{
//call update code here
//await DB.Update();
}
}
选项 3:在 ViewCell 中覆盖 OnAppearing()
另一种选择是确保在BindingContext 在ViewCell 上更新之后分配Toggled 事件处理程序。所以,我做了一个快速的实验来跟踪在加载视图时调用Handle_Toggled、OnBindingContextChanged、OnAppearing 方法的顺序。原来顺序是:
Handle_Toggled
OnBindingContextChanged
OnAppearing
因此,在 OnAppearing 方法中分配处理程序(在 ViewCell 的代码隐藏中)也应该适用于这种情况:
//XAML:<Switch x:Name="switchBtn" IsToggled="{Binding IsToggled}" />
protected override void OnAppearing()
{
base.OnAppearing();
switchBtn.Toggled += Handle_Toggled;
Debug.WriteLine("OnAppearing");
}
protected override void OnDisappearing()
{
base.OnDisappearing();
switchBtn.Toggled -= Handle_Toggled;
Debug.WriteLine("OnDisappearing");
}
这样Handle_Toggled只会在用户切换开关时被调用。