2017-03-23 4 views
0

Ich versuche, den Text in einem TextView durch Anpassen einer SeekBar zu ändern. Wenn ich die Eigenschaft TapSelectionProgress direkt (TapSelectionProgress = 2;) setze, wird das TextView aktualisiert. Das Bindungsupdate wird jedoch nie von der Benutzeroberfläche ausgelöst.MVVM Light Binding SeekBars Fortschritt

In Main.axml:

<SeekBar 
    android:id="@+id/tapSeekBar" 
    android:max="5" 
    android:layout_width="300dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:rotation="270" 
    android:padding="50dp" /> 

In MainViewModel.cs:

public int TapSelectionProgress 
{ 
    get 
    { 
     return _tapSelectionProgress; 
    } 
    set 
    { 
     Set(ref _tapSelectionProgress, value); 
     if (value == 0) 
     { 
      TapSelectionText = "Tap Selection: Off"; 
     } 
     else 
     { 
      TapSelectionText = String.Format("Tap Selection: {0}", value); 
     }     
    } 
} 

public string TapSelectionText 
{ 
    get 
    { 
     return _tapSelectionText; 
    } 
    set 
    { 
     Set(ref _tapSelectionText, value); 
    } 
} 

In MainActivity.cs:

_bindings.Add(this.SetBinding(
      () => TapSeekBar.Progress, 
      () => Vm.TapSelectionProgress)); 

Ich habe versucht, die Quelle Trigger Aktualisierung:

_bindings.Add(this.SetBinding(
      () => TapSeekBar.Progress, 
      () => Vm.TapSelectionProgress).UpdateSourceTrigger("ProgressChanged")); 

But this gives me an InvalidCastException

Ich habe auch versucht, BindingMode auf TwoWay einzustellen. Ich konnte keine Beispiele für MVVM Light mit einer SeekBar finden. Jede Hilfe wird geschätzt.

Hier ist das Call-Stack während Ausnahme:

0xFFFFFFFFFFFFFFFF in System.Diagnostics.Debugger.Mono_UnhandledException_internal C# 
0x1 in System.Diagnostics.Debugger.Mono_UnhandledException at /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/corlib/System.Diagnostics/Debugger.cs:122,-1 C# 
0x26 in object.1f29ec3d-529a-4f23-9cce-3fd0f5ac1e00 C# 
0x2F in System.Reflection.EventInfo.AddEventFrame<Android.Widget.SeekBar, System.EventHandler<Android.Widget.SeekBar.ProgressChangedEventArgs>> at /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/corlib/System.Reflection/EventInfo.cs:222,-1 C# 
0x7C in System.Reflection.EventInfo.AddEventHandler at /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/corlib/System.Reflection/EventInfo.cs:110,-1 C# 
0xC5 in GalaSoft.MvvmLight.Helpers.Binding<int,int>.UpdateSourceTrigger at c:\MvvmLight\Source\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Platform (Android)\Helpers\BindingGeneric.cs:342,13 C# 
0x172 in MDP_Demo.MainActivity.OnCreate at c:\hgroot\Mobile\MDP Demo\MDP Demo\MainActivity.cs:51,13 C# 
0x13 in Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ at /Users/builder/data/lanes/3511/501e63ce/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.App.Activity.cs:2102,4 C# 
0x17 in object.1f29ec3d-529a-4f23-9cce-3fd0f5ac1e00 C# 
+0

Sie sollten auch die 'InvalidCastException' hier, wie es auf das Problem etwas Licht kann. – Xiaoy312

+0

Ich habe einen Screenshot der Nachricht hinzugefügt, die ich erhalte. Ich fürchte, es gibt mir nicht viele Informationen außer "Angegebener Cast ist nicht gültig". UpdateSourceTrigger gibt ein Binding -Objekt zurück. –

+0

Ich sollte hinzufügen, dass die Bindung der TextView funktioniert. '_bindings.Add (this.SetBinding ( () => Vm.TapSelectionText, () => TapSelectionLabel.Text));' –

Antwort

2

ich in der Lage war, es zum Laufen zu bringen, wenn auch nicht so, wie ich gewünscht habe. Ich hatte die gleiche Ausnahme geworfen, als ich SetCommand versuchte, also brach ich die MVVM-Architektur ein wenig.

TapSeekBar.ProgressChanged += new EventHandler<SeekBar.ProgressChangedEventArgs>(TapSeekBar_ProgressChanged); 

...

private void TapSeekBar_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e) 
{ 
    Vm.TapSelectionProgress = e.Progress; 
} 

den Slider bewegen aktualisiert nun die Eigenschaft und löst UI-Updates.

+0

Ich habe die richtige Lösung unten hinzugefügt – Ryan

0

Wahrscheinlich zu spät für Sie, aber ich hatte das gleiche Problem vor einem Moment - Graben in der MVVM Lichtquelle gab mir den Hinweis auf die echte Lösung. Sie müssen die Art der EventArgs für ObserveSourceEvent (der neue Name für Update), wie folgt festgelegt:

  .ObserveSourceEvent<ProgressChangedEventArgs>(nameof(SeekBar.ProgressChanged))); 
Verwandte Themen