绑定命令不能在没有XAML的ReactiveUI 6.5.2 Xamarin上工作

本文关键字:Xamarin 工作 ReactiveUI 不能 命令 XAML 绑定 | 更新日期: 2023-09-27 18:15:23

嗨,有人帮我一下,我不知道为什么会出现这个错误。我有一个视图白色硬编码在c#和Xamarin表单没有XAML文件,在这种配置下,我已经成功地出现了视图,但是错误已经启动异常,当我试图绑定命令到ReactiveUI 6.5.2,下面你有例外,代码:

UNHANDLED EXCEPTION:

系统。异常:找不到Xamarin.Forms.Entry类型的默认属性getviewexpressionwithproperty (System.)对象视图,System.Linq.Expressions.Expression vmExpression) [0x00059]在代码/用户/保罗//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

}

绑定命令不能在没有XAML的ReactiveUI 6.5.2 Xamarin上工作

您需要将这一行推入条目实例:

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

你需要把初始文本,这个BindableProperty works,关闭诅咒。我将编辑代码,由于某些原因,其他人将来也会有同样的问题。

我认为这是Url绑定的问题。它说它找不到Xamarin.Forms类型的默认属性。条目,它是Url的类型。您需要给出它要绑定的属性,即Text。

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