绑定命令不能在没有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'-'._'?',''/'''+&%'$#'=~])*[^'.',')'('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
}
您需要将这一行推入条目实例:
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);