c# - 带有 MvxSpinner 的 MvxListView 在第一个项目上显示空条目

标签 c# android xamarin mvvmcross mvxbind

我正在使用一个包含 MvxSpinner 的 MvxListView。当我的应用程序运行时,跟踪显示以下几个实例:

当前微调器 SelectedItem 绑定(bind)中不允许使用空值

我知道数据对象上的条目不为空。这是相关代码:MvxListView 的布局是

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <MvxListView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                local:MvxBind="ItemsSource ShipmentLots.Lots"
                local:MvxItemTemplate="@layout/inventorylotview" />
            <ImageButton
                android:src="@drawable/ic_action_new"
                android:layout_width="60dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                local:MvxBind="Click NewLot_Clicked"
                android:id="@+id/btnLotNew" />
        </LinearLayout>

MvxItemTemplate 的布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <MvxSpinner
        android:layout_width="130dp"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        style="@style/InputSpinner"
        local:MvxItemTemplate="@layout/itemspinner"
        local:MvxDropDownItemTemplate="@layout/itemspinnerdropdown"
        local:MvxBind="ItemsSource LotColors; SelectedItem LotColor"
        android:id="@+id/spinner1" />
    <EditText
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        style="@style/InputEditText"
        local:MvxBind="Text LotNo" />
    <ImageButton
        android:src="@drawable/ic_action_delete"
        android:layout_width="60dp"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        local:MvxBind="Click DeleteClicked"
        android:id="@+id/btnLotDelete" />
</LinearLayout>

InventoryViewModel 如下:

public class InventoryViewModel
  : MvxViewModel
{
    public async void Init(Guid ID)
    {
        await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentInventory(ID);
        ShipmentInventory = ShipmentDataSource.CurrInventory;

        Shipment = await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipment((int)ShipmentInventory.idno, (short)ShipmentInventory.idsub);
        ShipmentLots = await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentLotList(Shipment.idno, Shipment.idsub);
    }

    private Shipment _Shipment;
    public Shipment Shipment
    {
        get { return _Shipment; }
        set { _Shipment = value; RaisePropertyChanged(() => Shipment); }
    }

    private ShipmentInventory _ShipmentInventory;
    public ShipmentInventory ShipmentInventory
    {
        get { return _ShipmentInventory; }
        set { _ShipmentInventory = value; RaisePropertyChanged(() => ShipmentInventory); }
    }

    private ShipmentLotList _ShipmentLots;
    public ShipmentLotList ShipmentLots
    {
        get { return _ShipmentLots; }
        set { _ShipmentLots = value; RaisePropertyChanged(() => ShipmentLots); }
    }

    public IMvxCommand NewLot_Clicked
    {
        get
        {
            return new MvxCommand(() => NewLot());
        }
    }

    private void NewLot()
    {
        ShipmentLot Lot = new ShipmentLot();
        Lot.ID = Guid.NewGuid();
        Lot.idno = Shipment.idno;
        Lot.idsub = Shipment.idsub;
        ShipmentLots.Lots.Add(Lot);
    }

}

ShipmentLots 的 View 模型包含一个名为 Lots 的 ShipmentLot 类型的可观察集合。 ShipmentLots 的类是从 WCF 服务创建的。我将其扩展如下:

public partial class ShipmentLot
{

    private static string[] _LotColors = { "Yellow", "Brown", "White", "Blue", "Orange", "Red", "Green", "Purple" };
    public string[] LotColors
    {
        get { return _LotColors; }
    }

    public IMvxCommand DeleteClicked
    {
        get
        {
            return new MvxCommand(() => DeleteLot());
        }
    }

    private void DeleteLot()
    {
        MPS_Mobile_Driver.Droid.Views.InventoryView act = (MiscFunctions.CurrActivity as MPS_Mobile_Driver.Droid.Views.InventoryView) ?? null;
        if (act != null)
        {
            act.DeleteLot(this);
        }
    }
}

这负责让删除按钮起作用并为 MvxSpinner 提供颜色列表。当我运行该应用程序时,出现 Null value not allowed 错误,并且 MvxListView 中的第一项在 MvxSpinner 上的颜色错误。随后的工作正常。我不确定第一个有什么不同。有人对此有任何想法吗?

谢谢, 吉姆

最佳答案

在@Cheesebaron 和@Stuart 的帮助下,我发现如果您在 MvxItemList 内的 ItemTemplate 中使用 MvxSpinner 或 MvxAutoComplete,那么上面层次结构中的任何内容(包括 MvxItemlist)都不能有 android:layout_height="wrap_content"。原因是如果 Android 操作系统必须动态确定它们的高度,它就必须不止一次地绘制东西。所有的重绘都会让绑定(bind)变得困惑。如果将所有内容都设置为固定高度,则一切正常。要解决上述问题,上面 MvxItemView 的标记应该是

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
        <MvxListView
            android:layout_width="fill_parent"
            android:layout_height="300dp"
            local:MvxBind="ItemsSource ShipmentLots.Lots"
            local:MvxItemTemplate="@layout/inventorylotview" />
        <ImageButton
            android:src="@drawable/ic_action_new"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_gravity="center"
            local:MvxBind="Click NewLot_Clicked"
            android:id="@+id/btnLotNew" />
    </LinearLayout>

关键似乎是安排您的标记,这样它就不必预先呈现 MvxItemList 来确定屏幕部分的高度。想看更多的可以引用这个:

https://github.com/MvvmCross/MvvmCross/issues/944

我还有一个工作示例,说明如何在 MvxItemList 中执行 MvxSpinner:

https://github.com/JimWilcox3/MvxSpinnerTest

这开始是为了演示错误的 repo 协议(protocol)。一旦@Cheesebaron 告诉我出了什么问题,我就更正了它,所以它是一个有效的例子。希望这会对某人有所帮助。

关于c# - 带有 MvxSpinner 的 MvxListView 在第一个项目上显示空条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133382/

相关文章:

c# - 继承自 System.ValueType

java - 如何在 Android UI 中设置布局背景

xamarin - 条件编译似乎在 Xamarin Studio 中不起作用

ios - OpenGL ES 2.0 - 绘制线条(绘图)中的内存管理

Android Activity 方向改变,每次新实例

c# - 查询在 phpMyAdmin 中工作正常,但在应用程序中则不行(C#)

c# - XML 树生成

android - 如何在Android Studio中使用ndk-build的自动调用

android - 如何在运行时更改 MAIN Activity

c# - 如何从 Web 应用程序调试 C#/.NET 解决方案中的 Web 服务