c# - 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
扩展。
解决方案
由此,我认为 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();
}
推荐阅读
- java - 有没有办法使用 Marketo REST API 从 csv 文件导入自定义对象数据?
- javascript - 使用函数表达式与函数声明作为闭包
- python - VSCode:自动打开集成终端和交互窗口
- javascript - 如何在用户登录后立即将来自 Firebase 身份验证的用户数据添加到 Firebase 实时数据库中?
- node.js - Electron:TypeError:无法在符号'Symbol(nodejs.util.inspect.custom)'上创建属性'default'
- c++ - 如何从类外修改向量
- scala - SBT scalariform 插件多次格式化相同的东西,可以做一次吗?
- javascript - “对象[值] = true”的含义
- php - 如何对其中一张表进行 sql 连接限制
- c# - 如何检查类型是否为自定义类