如何阻止交换机上的Toggled Event在加载页面时被触发?

时间:2017-08-22 15:15:46

标签: xamarin xamarin.forms

我的应用程序在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事件。

是否有某些方法可以阻止这种情况发生,因为在启动时没有理由更新数据库。

2 个答案:

答案 0 :(得分:2)

选项-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事件

下一个选项是订阅您的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();
    }
}

选项-3:在ViewCell中覆盖OnAppearing()

另一个选项是确保在Toggled上更新BindingContext后分配ViewCell事件处理程序。因此,我做了一个快速实验来跟踪加载视图时调用的Handle_ToggledOnBindingContextChangedOnAppearing方法。订单结果是:

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>

更多信息: