こんにちは誰かが私にこれを助けてください、私はなぜこのエラーが表示されるのか分かりません。 この設定では、C#およびXamarフォームにXAMLファイルが含まれていないビューウィットがハードコードされていますが、この設定ではビューに成功しましたが、ReactiveUI 6.5.2にコマンドをバインドしようとすると例外が発生しました。例外、およびコード:バインドコマンドはReactiveUIで動作しません6.5.2 Xamarin whitout XAML
UNHANDLED EXCEPTION:
のSystem.Exception:ReactiveUI.Reflection.getViewExpressionWithPropertyでタイプXamarin.Forms.Entry のデフォルトプロパティが見つかりませんでした(System.Objectのビュー、System.Linq.Expressions .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\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\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
}
同じエラーが解決されず、問題のコードを編集しました。この試みに感謝します。 – seeAlex