2016-10-28 1 views
0

안녕하세요 누군가 제가이 문제를 도와 주는데, 왜이 오류가 나타나는지 잘 모르겠습니다. C# 및 Xamar 파일없이 XAML 파일로 코딩 된 뷰 Whit이이 구성에서보기에 성공했지만 ReactiveUI 6.5.2에 명령을 바인드하려고하면 예외가 발생했습니다. 를 제외하고 코드 :바인드 명령이 ReactiveUI에서 작동하지 않습니다. 6.5.2 Xamarin whitout XAML

UNHANDLED EXCEPTION: 

System.Exception : ReactiveUI.Reflection.getViewExpressionWithProperty (은 System.Object보기 System.Linq.Expressions에서 형 Xamarin.Forms.Entry 에 대한 기본 속성을 찾을 수 없습니다 .Expression vmExpression) [0x00059] /Users/paul/code/reactiveui/reactiveui/ReactiveUI/Reflection.cs:259

및 코드 :

public class EntryPageCode : ReactiveContentPage<APISettingsViewModel> 
{ 

    StackLayout layout; 
    public Button SaveUrl { get; protected set; } 
    public Entry Url{ get; set; } 

    public EntryPageCode() 
    { 
     layout = new StackLayout { Padding = new Thickness(0, 20, 0, 0) }; 
     this.Title = "Settings"; 

     Url = new Entry 
     { 
      Text = "",//Here the trick 
      Placeholder = "API url Please" 
     }; 

     SaveUrl = new Button 
     { 
      Text = "Save", 
      Font = Font.SystemFontOfSize(NamedSize.Large), 
      BorderWidth = 1, 
      HorizontalOptions = LayoutOptions.Center, 
      VerticalOptions = LayoutOptions.CenterAndExpand 
     }; 

     Label messagemLbl = new Label 
     { 
      Text = "Loading", 
      Font = Font.BoldSystemFontOfSize(50), 
      HorizontalOptions = LayoutOptions.Center 
     }; 

     ActivityIndicator Loading = new ActivityIndicator 
     { 
      IsRunning = false, 
     }; 

     layout.Children.Add(new Label { Text = "URL" }); 
     layout.Children.Add(Url); 
     layout.Children.Add(SaveUrl); 
     layout.Children.Add(messagemLbl); 
     layout.Children.Add(Loading); 

     this.Content = layout; 

     this.Bind(ViewModel, vm => vm.Url, Url.Text); 
     this.BindCommand(ViewModel, vm => vm.SaveUrl, v => v.SaveUrl); 

     this.WhenAnyValue(x => x.ViewModel.IsLoading) 
      .ObserveOn(RxApp.TaskpoolScheduler) 
      .Subscribe(busy => 
      { 
       Url.IsEnabled = !busy; 
       Loading.IsVisible = busy; 
       Loading.IsRunning = busy; 
      }); 
    } 

} 

public abstract class ReactiveContentPage<TViewModel> : ContentPage, IViewFor<TViewModel> where TViewModel : class 
{ 

    public ReactiveContentPage() 
    { 
     ViewModel = Activator.CreateInstance<TViewModel>(); 
     SetupUserInterface(); 
     SetupReactiveObservables(); 
    } 

    protected readonly CompositeDisposable SubscriptionDisposables = new CompositeDisposable(); 

    //public static readonly BindableProperty ViewModelProperty = 
    // BindableProperty.Create<ReactiveContentPage<TViewModel>, TViewModel>(x => x.ViewModel, null, BindingMode.OneWay); 

    public static readonly BindableProperty ViewModelProperty = 
     BindableProperty.Create(nameof(ViewModel), typeof(TViewModel), typeof(ReactiveContentPage<TViewModel>), null, BindingMode.OneWay); 

    #region IViewFor implementation 
    public TViewModel ViewModel 
    { 
     get 
     { 
      return (TViewModel)GetValue(ViewModelProperty); 
     } 
     set 
     { 
      SetValue(ViewModelProperty, value); 
     } 
    } 
    #endregion 

    #region IViewFor implementation 
    object IViewFor.ViewModel 
    { 
     get 
     { 
      return ViewModel; 
     } 
     set 
     { 
      ViewModel = (TViewModel)value; 
     } 
    } 
    #endregion 

    protected virtual void SetupUserInterface() { } 

    protected virtual void SetupReactiveObservables() { } 

    protected virtual void SetupReactiveSubscriptions() { } 

    protected override void OnAppearing() 
    { 
     SetupReactiveSubscriptions(); 

     base.OnAppearing(); 
    } 

    protected override void OnDisappearing() 
    { 
     SubscriptionDisposables.Clear(); 
     base.OnDisappearing(); 
    } 
} 

public class APISettingsViewModel : ReactiveObject 
{ 
    //await Navigation.PopAsync(); 
    #region Inital Variables 
    private string _url; 
    private Realm _realm; 

    public ReactiveCommand<string> SaveUrl { get; protected set; } 

    public string Url 
    { 
     get { return _url; } 
     set { this.RaiseAndSetIfChanged(ref _url, value); } 
    } 

    readonly ObservableAsPropertyHelper<bool> _isLoading; 
    public bool IsLoading 
    { 
     get { return _isLoading.Value; } 
    } 
    #endregion 

    #region Constructor 
    /// <summary> 
    /// Constructor View Model 
    /// </summary> 
    /// <param></param> 
    public APISettingsViewModel() 
    { 

     #region Initialize Varables 

     _realm = Realm.GetInstance(); 

     var config = _realm.All<APISettings>().Where(d => d.Url != null).FirstOrDefault(); 
     if (config != null) 
     { 
      _url = config.Url; 
     } 
     #endregion 

     #region Initialize Rx Settings 

     var canSave = this.WhenAnyValue(x => x.Url, (ur) => 
     { 
      return !String.IsNullOrWhiteSpace(ur) && 
      Regex.IsMatch(ur, @"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$", 
       RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250)); 
     }); 

     SaveUrl = ReactiveCommand.CreateAsyncTask<string>(canSave, 

      async _ => 
      { 
       return await RealmSaveUrl(); 
      } 
      ); 
     SaveUrl.IsExecuting.ToProperty(this, x => x.IsLoading, out _isLoading); 
     SaveUrl.ThrownExceptions 
      .Subscribe(ex => UserError.Throw("Error", ex)); 
     SaveUrl.Subscribe(
       r => 
       { 
        Debug.WriteLine("See it:" + r.ToString()); 
       } 
      ); 

     #endregion 



    } 
    #endregion 

    #region Methods 
    private async Task<string> RealmSaveUrl() 
    { 

     try 
     { 
      var apiSet = _realm.All<APISettings>().FirstOrDefault(); 

      if (apiSet == null) 
      { 
       _realm.Write(() => 
       { 
        apiSet = _realm.CreateObject<APISettings>(); 
        apiSet.Url = Url; 
       }); 
      } 
      else 
      { 
       _realm.Write(() => 
       { 
        apiSet.Url = Url; 
       }); 
      } 

      return apiSet.Url; 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Error >> " + ex.StackTrace); 
      return "IHandleObservableErrors"; 
     } 


    } 

    #endregion 


} 

답변

1

당신은 항목 인스턴스에서이 줄을 추진해야이 BindableProperty 저주 떨어져 작동에

Url = new Entry 
     { 
      Text = "", 
      Placeholder = "API url Please" 
     }; 

당신은, 초기 텍스트를 넣을 필요가있다. 나는 다른 사람의 어떤 이유로 미래에 같은 문제가 있기 때문에 코드를 편집 할 것입니다.

0

URL 바인딩과 관련된 문제라고 생각합니다. 그것은 Url의 형식 인 Xamarin.Forms.Entry 유형에 대한 기본 속성을 찾을 수 없다고 말합니다. 바인딩 할 속성, 즉 텍스트를 지정해야합니다.

this.Bind(ViewModel, vm => vm.Url, v => v.Url.Text); 
+0

동일한 오류가 지속되었으며, 문제의 코드를 편집했습니다.이 시도에 대해 감사드립니다. – seeAlex

관련 문제