如何在ViewModel中绑定ListView的ItemTapped属性以导航详细信息页面?

时间:2016-04-13 13:38:13

标签: listview mvvm prism xamarin.forms

我正在试图弄清楚如何绑定ListView的ItemTapped以便使用Prism导航详细信息页面。 我尝试使用DelegateCommand,但我有一个错误:

  

异常是:XamlParseException - 位置15:7。找不到名称ItemTapped的属性

查看:

<ListView
  ItemsSource="{Binding UsersList}"
  SelectedItem="{Binding SelectedUser}"
  ItemTapped="{Binding ShowUserDetail}"
  RowHeight="65" >
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <StackLayout Padding="20" HorizontalOptions="FillAndExpand">
          <Label Text="{Binding Name}" TextColor="Blue" FontSize="15"/>
          <Label Text="{Binding Email}" TextColor="Gray" FontSize="11"/>
        </StackLayout>
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

视图模型:

public class UsersViewModel : BindableBase
{

    ..... some bindable objects 

    INavigationService _navigationService;
    public DelegateCommand ShowUserDetail { get; set; }

    public UsersViewModel (INavigationService navigationService)
    {
        _navigationService = navigationService;
        ShowUserDetail = new DelegateCommand(OnShowUserDetail);
    }

    public void OnShowUserDetail()
    {
        var par = new NavigationParameters();
        par.Add("user", SelectedUser);
        _navigationService.Navigate("UserDetail", par);
    }

    ....

当我将此DelegateCommand绑定到<Button>导航工作时。 可能这与Prism无关,但我找不到任何使用它的例子。 感谢。

2 个答案:

答案 0 :(得分:3)

Button有一个要绑定的Command属性,而ListView的ItemTapped是一个需要eventhandler的事件。如果要使用绑定,则必须使用行为:

<ListView
  ItemsSource="{Binding UsersList}"
  SelectedItem="{Binding SelectedUser}"
  RowHeight="65" >
  <ListView.Behaviors>
    <b:EventToCommand EventName="ItemTapped" Command="{Binding ShowUserDetail}" />
  </ListView.Behaviors>
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <StackLayout Padding="20" HorizontalOptions="FillAndExpand">
          <Label Text="{Binding Name}" TextColor="Blue" FontSize="15"/>
          <Label Text="{Binding Email}" TextColor="Gray" FontSize="11"/>
        </StackLayout>
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

来源:https://forums.xamarin.com/discussion/comment/180600/#Comment_180600

编辑: EventToCommandthis NuGet package中的行为。

答案 1 :(得分:1)

我相信Barts片段在某种程度上也有效,但我真的不知道如何以及我必须实施的内容。我建议更好的解释和一些工作代码示例。

我找到了有效的解决方案。

添加nuget包&#34; xamarin形成行为&#34; (在便携式和所有子项目iOS,Android ......中),我在ListView中添加了这个:

<ListView
    ItemsSource="{Binding UsersList}"
    SelectedItem="{Binding SelectedUser}">

    <b:Interaction.Behaviors>
        <b:BehaviorCollection>
            <b:EventToCommand EventName="ItemTapped" Command="{Binding ShowUserDetail}"/>
        </b:BehaviorCollection>
    </b:Interaction.Behaviors>
    ...

在标题中我设置了这一行(将b映射到命名空间):

xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"

还有一件事,对于iOS平台,这必须放在AppDelegate.cs / FinishedLaunching方法中(因为错误异常,这里描述了xamarin-behaviors-with-xamarin-forms-ios

Xamarin.Behaviors.Infrastructure.Init();

现在&#34; ItemTapped&#34;工作正常。