mvvmcross videoview URL绑定

时间:2014-11-25 17:06:41

标签: android xamarin cross-platform mvvmcross

我是MVVMCross的新手,目前正在努力解决绑定问题。 尝试将视频的URL与Android中的VideoView组件绑定。

  • 是否有可以自动执行的Mvx.MvxBind标记?
  • 否则,我如何将URL从MvxViewModel传递给MvxActivity?

如果无法使用第一个选项,我会尝试获取网址并按照此处的说明播放视频:http://developer.xamarin.com/recipes/android/media/video/play_video/

提前致谢。

1 个答案:

答案 0 :(得分:1)

MvvmCross非常灵活。您要求的不是内置的东西,但您可以轻松扩展MvvmCross以增加对它的支持。

MvvmCross拥有所谓的Binding Builders。这是您注册自定义目标绑定的位置。绑定采用类型,如 VideoView ,以及属性名称,如“ VideoUri”

当MvvmCross看到如local:MvxBind="VideoUri MyVideoUri"之类的绑定属性时,它将从 MyVideoUri 获取属性值,然后调用自定义绑定,该绑定最终将调用videoView.SetVideoURI()

以下是您需要采取的步骤。

1)在Android项目中,编辑 Setup.cs 并添加以下内容,以注册自定义绑定构建器。

    protected override MvxAndroidBindingBuilder CreateBindingBuilder()
    {
        return new MyAndroidBindingBuilder();
    }

2)创建一个自定义绑定构建器,该构建器是默认Android绑定构建器的子类:

public class MyAndroidBindingBuilder : MvxAndroidBindingBuilder
{
    protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories(registry);

        registry.RegisterCustomBindingFactory<VideoView>("VideoUri",
                                             videoView => new MvxVideoViewUriTargetBinding(videoView));

    }
}

3)为VideoView和属性“VideoUri”创建自定义目标绑定:

public class MvxVideoViewUriTargetBinding : MvxAndroidTargetBinding
{
    public MvxVideoViewUriTargetBinding(object target) : base(target)
    {
    }

    public override Type TargetType
    {
        get { return typeof (string); }
    }

    protected override void SetValueImpl(object target, object value)
    {
        var videoView = (VideoView) target;
        videoView.SetVideoURI(Uri.Parse((string)value));
    }
}

要在布局中使用它,只需创建以下内容:

1)在 layout.xml

<VideoView
    android:id="@+id/SampleVideoView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    local:MvxBind="VideoUri MyVideoUri" />

2)在 ViewModel 中,为MyVidoeUri添加属性

    public string MyVideoUri
    {
        get { return "http://ia600507.us.archive.org/25/items/Cartoontheater1930sAnd1950s1/PigsInAPolka1943.mp4"; }
    }

3)在您查看中,您可以像这样开始播放视频:

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.MyLayout);

        // SetVideoURI() already called via binding
        var videoView = FindViewById<VideoView>(Resource.Id.SampleVideoView);
        videoView.Start();
     }

查看MvxAndroidBindingBuilder的源代码以查看当前绑定。 https://github.com/MvvmCross/MvvmCross/blob/bbf9a2ac76e74d9404f4b57036c6e29dfe2cc6c3/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs

希望这有帮助。