首页 > 解决方案 > MvvmCross 和 AsyncLayoutInflater

问题描述

我正在尝试绑定以使用 Xamarin Android 中的 AsyncLayoutInflater。

这是我的课程:创建了视图,但没有任何约束。关于我做错了什么的任何提示?

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扩展。

标签: c#androidxamarinxamarin.androidmvvmcross

解决方案


由此,认为 AsyncLayoutInflater.LayoutInflater 应该设置为 context.LayoutInflater 但 LayoutInflater 在AsyncLayoutInflater中是私有的,所以没有办法做到这一点。

但是你还有另一个选择。充气完成后,您可以进行编程绑定:

        using (var bindingSet = this.CreateBindingSet<your_activity, your_view_model>())
        {
            bindingSet.Bind(view.TextView).To(vm => vm.Text);
            bindingSet.Apply();
        }

推荐阅读