嵌套的MvxListView绑定失败

时间:2014-02-20 04:58:05

标签: mvvmcross

是否可以嵌套绑定的MvxListView(mvvmcross android v3.1系列)?

我发现嵌套绑定失败了:

MvxBind:Warning:  1.17 Unable to bind: source property source not found Property:Command on MenuSection

我们的ViewModel看起来有点像

   class SomeViewModel : MvxViewModel{
       public List<MenuSection> Sections{get;set;}
   }

其中

class MenuSection{
   public string Title{get;set;}
   public MenuItem[] Items{get;set;}
}
class MenuItem{
   public string Name {get;set;}
   public ICommand Command{get;set;}
}

删除了大多数非mvx属性的axml的缩减版本如下所示:

布局/ page_home.axml

<android.support.v4.widget.DrawerLayout>
  <FrameLayout android:id="@+id/content_frame"/>
  <Mvx.MvxListView
        local:MvxBind="ItemsSource Sections"
        local:MvxItemTemplate="@layout/item_menusection" />
</android.support.v4.widget.DrawerLayout>

布局/ item_menusection.axml

<LinearLayout>
  <TextView local:MvxBind="Text Title"/>
  <Mvx.MvxListView
      local:MvxItemTemplate="@layout/item_menusection_item"
      local:MvxBind="ItemSource Items; ItemClick Command" />
</LinearLayout>

布局/ item_menusection_item.axml

<TextView local:MvxBind="Text Name"/>

1 个答案:

答案 0 :(得分:1)

那是因为你将内部ListView绑定到MenuSection对象。

Commmand属性位于MenuIction对象中,不在MenuSection中。

您需要将Command移动到MenuSection。

编辑:

page_home.axml 绑定到 SomeViewModel =&gt;

ListView.Items 绑定到 SomeViewMode.Sections =&gt;

item_menusection.axml 中定义的每个项目都绑定到 MenuSection =&gt;

(在 item_menusection.axml 中) ListView.Items 绑定到 MenuSections.Items =&gt;

item_menusection_item.axml 中定义的每个项目都绑定到 MenuItem =&gt;

TextView.Text 绑定到 MenuItem.Name

同样在 item_menusection.axml ListView.ItemClick 绑定到 MenuSections.Command (它不存在)

这是因为你如何定义 layout / item_menusection.axml

<LinearLayout>
  <TextView local:MvxBind="Text Title"/>
  <Mvx.MvxListView
      local:MvxItemTemplate="@layout/item_menusection_item"
      local:MvxBind="ItemSource Items; ItemClick Command" />
</LinearLayout>

ListView的ItemSource和ItemClick都绑定到到相同的视图模型(MenuSections)。

如果您想要处理项目,请在MenuItem视图模型中单击,您可以通过以下几种方式执行此操作:

您可以尝试使item_menusection_item中的布局可单击,并将click事件绑定到MenuItem.Command。

或者,向MenuSection添加一个Command属性,然后依次调用所选MenuItem的Command:

public class MenuSection
{
    public string Title{get;set;}
    public MenuItem[] Items{get;set;}    
    public ICommand Command { get { return new MvxCommand<MenuSection>((ms) => ms.Command.Execute(null)); } }
}