Я пытаюсь получить привязку для работы с AsyncLayoutInflater в Xamarin Android.
Вот мой класс: представление создается, но ничто не связано.Любые намеки на то, что я делаю неправильно?
public static class MvxAsyncBindingExtensions
{
private static readonly AsyncLayoutInflater _inflater = new AsyncLayoutInflater(AndroidContext.CurrentTopActivity);
public static Task<View> BindingInflateAsync(this IMvxBindingContextOwner owner, int resourceId, ViewGroup viewGroup)
{
var context = (IMvxAndroidBindingContext)owner.BindingContext;
return context.BindingInflateAsync(resourceId, viewGroup);
}
public static Task<View> BindingInflateAsync(this IMvxAndroidBindingContext bindingContext, int resourceId, ViewGroup viewGroup)
{
var tcs = new TaskCompletionSource<View>();
var registration = new MvxBindingContextStackRegistration<IMvxAndroidBindingContext>(bindingContext);
var listener = new AsyncInflateFinishedListener(tcs, view => registration.Dispose());
_inflater.Inflate(resourceId, viewGroup, listener);
return tcs.Task;
}
private class AsyncInflateFinishedListener : Java.Lang.Object, AsyncLayoutInflater.IOnInflateFinishedListener
{
private readonly TaskCompletionSource<View> _tcs;
private readonly Action<View> _onCreated;
public AsyncInflateFinishedListener(TaskCompletionSource<View> tcs, Action<View> onCreated)
{
_tcs = tcs;
_onCreated = onCreated;
}
public void OnInflateFinished(View p0, int p1, ViewGroup p2)
{
_tcs.TrySetResult(p0);
_onCreated(p0);
}
}
}
, тогда я использую это следующим образом:
private async Task<View> CreateAndBindViewAsync(FilterItemEntity item)
{
var sourceBindingContext = this.BindingContext as MvxAndroidBindingContext;
var bindingContext = new MvxAndroidBindingContext(this.Context, sourceBindingContext.LayoutInflaterHolder);
var view = await bindingContext.BindingInflateAsync(_itemTemplateId, _flowLayout);
bindingContext.DataContext = item;
return view;
}
У меня есть подобный код, который работает с обычным расширением BindingInflate
очень хорошо.