Xamarin.Forms - 滑块ValueChanged事件是如何引发的?

时间:2017-01-23 21:48:02

标签: c# event-handling xamarin.forms

是否有一种有效的方法来确定用户输入或程序更新是否引发了Xamarin.Forms.ValueChangedEventArgs事件?

我在XAML中创建了一个滑块,我需要确保只有在用户更改了滑块的值时才执行事件处理程序中的代码,如果以编程方式更改了值,则不执行任何操作。

基本上,我正在寻找与Xamarin.Android中的SeekBar.ProgressChangedEventArgs.FromUser属性相当的Xamarin.Forms。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:0)

MVVM的重点是滑块绑定的属性应该代表滑块位置而不是其他内容。就视图模型逻辑代码的其余部分而言,滑块属性 IS 是滑块。您不会将整个控件子类化以确定其值的设置位置,因为在使用您的控件的代码中,该逻辑更容易实现。 MVVM没有任何不同,即将这种逻辑放在视图控件绑定的属性中会破坏模式,因为属性应该与控件属性具有1:1的关系。

根据你的描述,听起来你正试图做这样的事情:

public int SliderPos
{
    set
    {
        if (valueChangedManually()) // <-- magic function
            ManualChangeFunction();
    }
    // ... etc ...
}

void ChangeSliderPosManually()
{
    SliderPos = 100;
}

如果是这样,那么你需要这样做:

public int SliderPos
{
    set
    // ... etc ...
}

void ChangeSliderPosManually()
{
    ManualChangeFunction();
    SliderPos = 100;
}

结果相同,但逻辑由调用代码处理。如果在任何时候SliderPos的值自发地发生变化并且您没有调用ManualChangeFunction,那么您知道它必须由滑块控件触发。

如果您确实需要知道更改是滑块与代码的结果,那么就可以向控件本身添加行为,将通知发送回您的视图模型层,但这有点复杂,并且10年左右的时间我一直在开发MVVM,我无法想到我曾经有过真正需要这样做的时间。

答案 1 :(得分:0)

虽然这是一篇旧帖子,但仍然具有相关性。原因是我最近开发了一个音乐播放器应用程序。当我使用Xamarin.Forms slider时,它会引发ValueChanged事件,无论该值是由User还是programmatically手动更改的。

解决方案是使用xamarin-range-slider。 Nuget可用于xamarin表单以及本机项目。它有事件UpperValueChangedLowerValueChanged。当User拖动滑块时会引发这些事件。他们没有触发滑块值的程序化更改。