是否可以嵌套绑定的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"/>
答案 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)); } }
}