拍了拍我有一個簡單Xamarin.Forms.ContentPage,在一個ListView
顯示菜單項:背後Xamarin.Forms.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會給您從列表,從中可以得到這兩個鍵和值 – Jason
@Jason數據綁定物品:非常感謝你!現在看起來很明顯... ...!我仍然懷疑是否有可能以任何方式直接「輕鬆」映射命令,但這肯定會實現。再次感謝您的快速反饋:)! –
有點偏離主題:不知道你是否將Listview放入ScrollView只是爲了演示,否則請看看這裏https://stackoverflow.com/questions/6210895/listview-inside-scrollview-is-not-scrolling-on- android/6211286#6211286 – K232