MvvmCross и AsyncLayoutInflater - PullRequest
       27

MvvmCross и AsyncLayoutInflater

1 голос
/ 24 мая 2019

Я пытаюсь получить привязку для работы с 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 очень хорошо.

...