我的应用程序在XAML中设置了一个开关,并在后端C#代码中响应了切换事件
<ViewCell x:Name="ss">
<Switch x:Name="ssSwitch" Toggled="SsSwitch" />
</ViewCell>
void SsSwitch(object sender, ToggledEventArgs e) {
// Code to update database here
}
首次加载页面时,我注意到调用了SwSwitch Toggled事件。
是否有某些方法可以阻止这种情况发生,因为在启动时没有理由更新数据库。
答案 0 :(得分:2)
如果您使用MVVM - 解决此问题的最简单方法是使用属性设置器来检测值更新(如此link所述)。但是,如果您想在此处调用等待方法,则此选项不起作用。此外,作为最佳做法,建议属性不应实现any time consuming operations。
bool _isToggled;
public bool IsToggled
{
get
{
return _isToggled;
}
set
{
_isToggled = value;
// Add your update code here
}
}
PropertyChanged
事件下一个选项是订阅您的viewmodel中的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();
}
}
OnAppearing()
另一个选项是确保在Toggled
上更新BindingContext
后分配ViewCell
事件处理程序。因此,我做了一个快速实验来跟踪加载视图时调用的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
。
答案 1 :(得分:1)
使用上面的代码,Switch
不应在首次启动时触发事件。只有在您的IsToggled
属性与ViewModel绑定时才触发它!原因是,首先初始化Page,ViewModel切换Switch,然后事件被触发。
第一个解决方案是从代码隐藏处理IsToggled
属性和Toggled
事件(如果您正在使用代码,则不推荐)。更好的解决方案是从ViewModel处理两者。
问题是,Switch
控件没有Command
属性。您必须使用行为绑定到Command.
Sharada Gururaj上面已经发布了一个链接,并提供了一个很好的解释。
以下是Sharada Gururajs stackoverflow链接的简短解决方案:Xamarin Forms Switch Toggled event doesn't bind with viewmodel
<Switch IsToggled="{Binding IsToggled}">
<Switch.Behaviors>
<behaviors:EventHandlerBehavior EventName="Toggled">
<behaviors:InvokeCommandAction Command="{Binding ToggleSwitchCommand}" />
</behaviors:EventHandlerBehavior>
</Switch.Behaviors>
更多信息: