1

我在设计活动时遇到问题。

我正在尝试使用 Mvx.MvxBindableLinearLayout,绑定到列表:A、B 和 c;

当我执行此绑定时,结果是: A B C C B A

正确的应该是:A B C

有问题的代码是:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:local="http://schemas.android.com/apk/res/m2uMobileSales.Droid"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     >

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:local="http://schemas.android.com/apk/res/m2uMobileSales.Droid"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:showDividers="none"
      android:layout_weight="1">

    <include
        layout="@layout/PageCommon_Titlebar" />

    <TableLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tableLayout1"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:stretchColumns="1">
      <TableRow
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:id="@+id/tableLayout1"
          android:stretchColumns="1">
        <!--Customer Name-->
        <TextView
            android:id="@+id/CustomerName"
            android:layout_width="fill_parent"
             android:layout_height="wrap_content"
            android:textSize="30dp"
            android:layout_weight="1"
            local:MvxBind="{'Text':{'Path':'Customer.CustDetails.Name','Mode':'OneWay'}}" />
      </TableRow>

      <TableRow>
        <!--Detail Pages android:padding="12dp" -->

        <Mvx.MvxBindableLinearLayout
             android:padding="3dip"
             android:id="@+id/ClienteDetails"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
              android:divider="@null"
              android:dividerHeight="0dp"
              android:orientation="vertical"
              android:cacheColorHint="#00000000"
              android:layout_weight="1"
              local:MvxItemTemplate="@layout/listitem_clientdetailpages"
              local:MvxBind="{'ItemsSource':{'Path':'DetailPageViewModels'}}"/>

        <!--<Mvx.MvxBindableListView
            android:id="@+id/ClienteDetails"
            android:divider="@null"
            android:dividerHeight="0dp"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:cacheColorHint="#00000000"
            android:layout_weight="1"
            local:MvxItemTemplate="@layout/listitem_clientdetailpages"
            local:MvxBind="{'ItemsSource':{'Path':'DetailPageViewModels', 'Mode':'OneWay'}}" />-->
      </TableRow>

    </TableLayout>

  </LinearLayout>

</ScrollView>

如果我使用注释 Mvx.MvxBindableListView,我只能看到第一项。目标是滚动所有元素而不是列表,就像android的定义一样。克服这个问题后,我将在一个列表中有一个列表(DetailPageViewModels 将有几个元素,包括一个列表)。

我看过几篇建议在 ScrollView 中插入所有元素的帖子。

我试过评论 Mvx.MvxBindableLinearLayout,ScrollView 和 MvxBindableListView 效果很好。如果我使用 ScrollView,我只会看到第一个元素。

我的目标是使用 MvxBindableLinearLayout,因为我需要滚动整个页面和非元素。

listitem_clientdetailpages 代码:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res/m2uMobileSales.Droid"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:showDividers="none"
    android:layout_weight="1">

  <!--Page Title-->
  <TextView
      android:id="@+id/detailpagetitle"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:textSize="24dp"
       android:padding="3dip"
      local:MvxBind="{'Text':{'Path':'Title','Mode':'OneWay'}}" >
  </TextView>

</LinearLayout>

我为混乱道歉。

感谢您的帮助和可用性。

4

2 回答 2

2

我刚刚在 v3 中尝试过,这段代码按预期工作:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res/com.cirrious.dailydilbert"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
  >
   <Mvx.MvxLinearLayout
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       local:MvxBind="ItemsSource Items;ItemClick ItemSelectedCommand"
       local:MvxItemTemplate="@layout/listitem_dilbert" />
</ScrollView>

对于您发布的代码,我真的看不出 LinearLayout 中有任何问题。如果我可以看到列表项的模板和视图模型列表本身,这可能会有所帮助。如果您认为存在错误,请在某处发布一个简单的复制品,我会查看它 - 复制品越完整,我可以越快查看它 - 即理想情况下在 github repo 上发布完整的解决方案 - 我可以下载然后运行它。

对于可绑定的 ListView,我会对该属性有点怀疑android:layout_height="wrap_content"——怀疑它可能无法正常工作。


更新,我也在教程应用程序中尝试过,将 ListView 替换为 LinearLayout Page_MainMenuView.axml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res/Tutorial.UI.Droid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
  >  
<Mvx.MvxLinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    local:MvxBind="ItemsSource Items;ItemClick ShowItemCommand"
    local:MvxItemTemplate="@layout/listitem_viewmodel"
  />
</ScrollView>

这显示完美 - 这在您的设置中是否也有效?

如果是这样,那么问题一定出在您未包含的代码中...

于 2013-04-10T18:21:28.133 回答
1

我是 Paulo Dias 的同事,我们刚刚弄清楚发生了什么……问题在于创建MvxBindableLinearLayout

在构造函数中,我们有

 Adapter = new MvxBindableListAdapterWithChangedEvent(context);
 Adapter.DataSetChanged += AdapterOnDataSetChanged;

在属性“适配器”的“集合”中,我们有

var existing = _adapter;
if (existing == value)
    return;

if (existing != null && value != null)
{
    existing.DataSetChanged -= AdapterOnDataSetChanged;
    value.ItemsSource = existing.ItemsSource;
    value.ItemTemplateId = existing.ItemTemplateId;
}

if (value != null)
{
    value.DataSetChanged += AdapterOnDataSetChanged;
}

第一次创建 Adapter 时,DataSetChanged订阅了两次事件(在构造函数中和在适配器属性的集合中)。如果我们有一个可通知的集合绑定到MvxBindableLinearLayout.

现在是棘手的部分……这个错误只有在我们在创建 ui 控件后对绑定列表进行更改时才会“暴露”(即向列表中添加新项目)。如果我们在视图模型中有一个“在构造函数中设置”的列表,然后永远不会更改,DataSetChanged则永远不会触发该事件。另一方面,如果我们在创建 ui 之后添加项目(即,您可以将命令绑定到按钮,将项目添加到列表中),项目将在 ui 中复制...

为了解决这个问题,我们刚刚在MvxBindableLinearLayoutcontructor 中注释了 DataSetChanged 订阅的那一行,然后一切都回到原处:)

        public MvxBindableLinearLayout(Context context, IAttributeSet attrs)
            : base(context, attrs)
        {
            var itemTemplateId = MvxBindableListViewHelpers.ReadAttributeValue(context, attrs,
                                                                               MvxAndroidBindingResource.Instance
                                                                                                        .BindableListViewStylableGroupId,
                                                                               MvxAndroidBindingResource.Instance
                                                                                                        .BindableListItemTemplateId);
            Adapter = new MvxBindableListAdapterWithChangedEvent(context);
            Adapter.ItemTemplateId = itemTemplateId;
            //Adapter.DataSetChanged += AdapterOnDataSetChanged;
            this.ChildViewRemoved += OnChildViewRemoved;
        }

希望这可以帮助!

ps:想知道为什么以前没有人遇到过这个问题...

ps1:我们目前使用的是MvvmCross vNext。

ps2:我换了Mvvmcross V3,问题依旧。我会在 Github 中提出请求

于 2013-04-12T10:53:19.337 回答