【发布时间】: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<string, string>。 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