private void ProcessViewPropertyChanged(View view, object value, bool bForce = false) { try { var link = ViewToModelLinks[view]; if (link == null) { return; } if (link.Property.CanWrite) { var old = link.Property.GetValue(link.Object); if (!Equals(old, value) || bForce) { lock (LastViewValues) { if (LastViewValues.ContainsKey(link.ID)) { LastViewValues[link.ID] = value; } else { LastViewValues.Add(link.ID, value); } } link.Property.SetValue(link.Object, value); UserChangedProperty?.Invoke(view, new UserChangedPropertyEventArgs(link.Object, link.Property.Name, old, value)); } } } catch (Exception ex) { xLog.Error(ex); } }
private void DoWriteQueToView_func(List <KeyValuePair <ViewLink, object> > que) { xLog.Debug("start write " + que.Count + " values to view"); int iDone = 0; IsWritingToView = true; foreach (var kv in que) { try { var view = kv.Key.View; var prop = kv.Key.Property; object newVal = kv.Value; if (prop.Name == nameof(View.Visibility)) { if (newVal is bool) { newVal = (bool)newVal == true ? ViewStates.Visible : ViewStates.Gone; } else if (newVal is int) { newVal = (int)newVal > 0 ? ViewStates.Visible : ViewStates.Gone; } } if (newVal is DateTime) { newVal = ((DateTime)newVal).ToShortDateString(); } else if (newVal is TimeSpan) { newVal = ((TimeSpan)newVal).ToString(@"hh\:mm"); } if (!Equals(prop.GetValue(view), newVal)) { if (prop.CanWrite) { if (view is EditText && ViewToModelLinks.ContainsKey(view)) { var cLinkId = ViewToModelLinks[view].ID; if (LastViewValues.ContainsKey(cLinkId) && !Equals(prop.GetValue(view), LastViewValues[cLinkId])) { if (sys.Debugmode && Activity != null) { Toast.MakeText(Activity, DateTime.Now.ToString("HH:mm:ss.fff") + " ignore value: " + newVal.ToString(), ToastLength.Short).Show(); } continue; } } int iPos = -1; if (view is EditText) { iPos = (view as EditText).SelectionStart; } if (view is AutoCompleteTextView && nameof(AutoCompleteTextView.Text).Equals(prop.Name)) { (view as AutoCompleteTextView).SetText((string)newVal, false); } else { prop.SetValue(view, newVal); } iDone++; if (view is EditText) { if (iPos > 0)// && (view as EditText).Selected) { (view as EditText).SetSelection(Math.Min(iPos, newVal.ToString().Length)); } /*else if (!(view as EditText).Selected) * Toast.MakeText(Activity, "not selected", ToastLength.Short).Show(); * else * Toast.MakeText(Activity, "other reason", ToastLength.Short).Show();*/ } } else if (view is Spinner) { switch (prop.Name) { case nameof(Spinner.SelectedItemPosition): (view as Spinner).SetSelection((int)newVal); iDone++; break; default: throw new NotImplementedException("only SelectedItemPosition can be bound with a Spinner"); } } } } catch (Exception ex) { sys.LogException(ex); } } IsWritingToView = false; xLog.Debug("writing finished, {iDone} values changed"); }