我正在使用包含和MvxSpinner的MvxListView。当我的应用程序运行时,跟踪显示以下几个实例:
当前微调框的SelectedItem绑定中不允许使用空值
我知道数据对象上的条目不为空。以下是相关代码: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的视图模型包含一个称为Lots的ShipmentLot类型的可观察集合。从WCF服务创建ShipmentLots的类。我将其扩展如下:
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值不允许错误,并且MvxListView中的第一项在MvxSpinner上具有错误的颜色。后续的工作正常。我不确定第一个有什么不同。有人对此有任何想法吗?
谢谢,
吉姆
最佳答案
在@Cheesebaron和@Stuart的大力帮助下,我发现,如果您在MvxItemList内的ItemTemplate中使用MvxSpinner或MvxAutoComplete,则上面的层次结构(包括MvxItemlist)中的任何内容都不能具有android:layout_height =“ wrap_content”。原因是,Android OS必须动态绘制物体的高度才能绘制物体。所有重绘都会使绑定中的内容混乱。如果将所有内容设置为固定高度,则一切正常。要解决上述问题,上面的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
它以回购开始,以演示该错误。一旦@Cheesebaron向我展示了错误的地方,我就对其进行了更正,因此这是一个有效的示例。希望这会帮助某人。