2014-11-25 2 views
1

Я новичок в MVVMCross и в настоящее время борется с проблемой привязки. Попытка привязать URL-адрес видео с компонентом VideoView в android.mvvmcross videoview URL-привязка

  • Есть ли тег Mvx.MvxBind, который может сделать это автоматически?
  • В противном случае, как я могу передать URL-адрес из MvxViewModel в MvxActivity?

Если первый вариант не возможно я постараюсь, чтобы получить URL и воспроизводить видео, как описано здесь: http://developer.xamarin.com/recipes/android/media/video/play_video/

Спасибо заранее.

ответ

1

MvvmCross очень гибкий. То, что вы просите, не является встроенным, но вы можете легко расширить MvvmCross, чтобы добавить поддержку для него.

MvvmCross имеет так называемые Binding Builders. Здесь вы регистрируете пользовательские целевые привязки. Связывание имеет тип, например VideoView, а также название свойства «VideoUri».

Когда MvvmCross видит обязательный атрибут, как: local:MvxBind="VideoUri MyVideoUri" будет принимать значение свойства из MyVideoUri, затем вызвать пользовательские привязки, которые ulimiately будет вызывать 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) В вас View, вы можете запустить видео, как это:

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(); 
    } 

Посмотрите на источник для MvxAndroidBindingBuild чтобы просмотреть текущие привязки. https://github.com/MvvmCross/MvvmCross/blob/bbf9a2ac76e74d9404f4b57036c6e29dfe2cc6c3/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs

Надеюсь, что это поможет.