MvxSpinner绑定ItemsSource属性失效问题排查求助
看起来你在使用MvvmCross的MvxSpinner时遇到了数据不显示的问题,而手动设置Adapter的普通Spinner却能正常工作。结合你的代码情况,我整理了几个最可能遗漏的配置和步骤,你可以逐一排查:
1. 确保视图继承自MvvmCross的基类
MvvmCross的数据绑定系统依赖于它自身的视图基类来处理绑定上下文。如果你的Activity还是继承自普通的Activity或AppCompatActivity,绑定逻辑根本不会生效。你需要改成继承MvxActivity(如果用AppCompat库则继承MvxAppCompatActivity),示例代码如下:
public class TripPlanActivity : MvxActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 通过MvvmCross方式关联视图与ViewModel SetContentView<TripPlanViewModel>(Resource.Layout.your_plan_layout); } }
2. 修正布局中的自定义属性命名空间
你当前布局里的local命名空间是硬编码的包名:
xmlns:local="http://schemas.android.com/apk/lib/com.myco.app"
这种写法很容易因包名变更而出错,MvvmCross现在推荐用res-auto自动识别自定义绑定属性,修改为:
xmlns:mvx="http://schemas.android.com/apk/res-auto"
之后绑定属性就用mvx:MvxBind,能有效避免包名相关的问题。
3. 确保视图与ViewModel正确关联
如果你的Activity没有正确关联到对应的ViewModel,MvxSpinner根本找不到Items这个数据源。除了上面提到的SetContentView<YourViewModel>方式,也可以通过MvvmCross的导航服务打开页面,确保ViewModel实例被正确传递给视图。
4. 添加ItemTemplate(可选但推荐)
虽然MvxSpinner默认有基础项模板,但自定义模板能更可靠地解决渲染问题。你可以给MvxSpinner指定一个ItemTemplate:
<MvxSpinner android:id="@+id/spinner1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:prompt="@string/planet_prompt" mvx:MvxBind="ItemsSource Items" mvx:MvxItemTemplate="@layout/item_simple_text" />
然后创建item_simple_text.xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="12dp" android:textSize="16sp" mvx:MvxBind="Text ." />
这里的Text .表示直接绑定到集合中每个字符串元素本身。
5. 检查MvvmCross初始化是否完成
确保你的应用已经正确初始化MvvmCross,比如在Setup类中完成必要配置:
public class Setup : MvxAndroidSetup<App> { public Setup(Context applicationContext) : base(applicationContext) { } }
并在Application类中初始化:
[Application] public class YourApp : MvxAndroidApplication<Setup, App> { public YourApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { } }
你可以先从第1、2条开始排查,这两个是最常见的绑定失效原因。如果还是不行,可以在ViewModel的Items属性getter里加个断点,看看是否被调用——要是没触发,说明绑定上下文没建立,重点排查视图基类和ViewModel关联的问题。
内容的提问来源于stack exchange,提问作者Klaus Nji

