【问题标题】:Xamarin.Forms.ListView Item tapped with parameter带有参数的 Xamarin.Forms.ListView 项目
【发布时间】:2017-04-05 21:12:10
【问题描述】:

我有一个简单的 Xamarin.Forms.ContentPage,它在 ListView 中显示菜单项:

<ContentPage x:Class="Mob.Views.Public.MenuPage" ... >
  <ScrollView>
        <ListView ItemsSource="{Binding MenuItems}" ItemTapped="{Binding OnMenuItemTapped}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextCell Text="{Binding Key}" />
                    <!-- How to pass the "{Binding Value}" to OnMenuItemTapped? -->
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
  </ScrollView>
</ContentPage>

后面的代码:

public class MenuPage : ContentPage
{
    public MenuPage()
    {
        InitializeComponent();
        BindingContext = new MenuViewModel(); 
    }
    private async void OnMenuItemTapped(object sender, ItemTappedEventArgs e)
    {
        await (this.BindingContext as MenuViewModel).OnMenuItemTappedAsync(/* MUST PASS THE VALUE HERE*/);
    }
}

如您所见,ItemsSource 绑定到我的 ViewModel 的 MenuItems 属性。此属性的类型为Dictionnary&lt;string, string&gt;Key 用于显示项目的文本,而 Value 应作为参数传递给 OnMenuItemTapped 事件。

class MenuViewModel : ViewModelBase
{
    ...
    public IDictionary<string, string> MenuItems { get { return _menuItems; } set { SetProperty(ref _menuItems, value); } }
    // public ICommand OnMenuItemTappedCommand { get; set; }
    public MenuViewModel()
    {
        MenuItems = new Dictionary<string, string>();
        MenuItems.Add("XXX", "PageX");
        MenuItems.Add("YYY", "PageY");
        MenuItems.Add("ZZZ", "PageZ");
        // ...
        // I would've prefere to bind the item tap using a command but I can't figure out how to
        // OnMenuItemTappedCommand = new Command<string>(OnMenuItemTappedAsync);
    }

    public async Task OnMenuItemTappedAsync(string targetPage)
    {
        // await Navigation.PushModalAsync(...);
        // --> depending on the targetPage
    }
}

我的目标是根据传递给OnMenuItemTappedAsync 的值导航到正确的页面。

注意,我在这里尝试做“纯”MVVM。这意味着我知道我不应该使用事件并且将代码几乎留空。但我不知道如何在这种情况下使用命令。

任何想法/建议如何实现这一目标?

【问题讨论】:

  • 我相信e.Item会给你列表中的数据绑定项,你可以从中获取Key和Value
  • @Jason:非常感谢!顺便说一句,现在看起来很明显......!我仍然怀疑是否可以以任何方式直接“轻松”映射命令,但这肯定会做到。再次感谢您的快速反馈:)!
  • 有点跑题了:不知道你是不是为了这个demo才把Listview放到ScrollView里的,否则请看这里stackoverflow.com/questions/6210895/…

标签: c# xaml listview mvvm xamarin.forms


【解决方案1】:

向 ViewCell 内容添加 TapGesture 并将 Command 与它绑定。 例如:

<TapGestureRecognizer Command="{Binding OnMenuItemTappedCommand}" CommandParameter="{Binding .}" />

在您的情况下,您可以将命令直接绑定到 TextCell。

<TextCell Command="{Binding OnMenuItemTappedCommand}" CommandParameter="{Binding .}">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2019-03-21
    • 2012-07-16
    • 2017-03-28
    相关资源
    最近更新 更多