Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

Xamarin.FormsでListViewのItemTemplate内のボタンにPageにバインドされているVMにあるCommandをバインドする方法

$
0
0

こういうの悩みますよね。例えば以下のようなViewModelがあるとします。こいつのAlertCommandに選択項目を渡したいというケースです。

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using Xamarin.Forms;

namespace App52
{
    publicclass MainPageViewModel : INotifyPropertyChanged
    {
        publicevent PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<string> Items { get; } = new ObservableCollection<string>(Enumerable.Range(1, 100)
            .Select(x => $"Item{x}"));

        public Command AlertCommand { get; }

        public MainPageViewModel()
        {
            this.AlertCommand = new Command<string>(x =>
            {
                Debug.WriteLine($"Execute: {x}");
            });
        }
    }
}

こういう感じのXAMLでいけます。

<?xml version="1.0" encoding="utf-8"?><ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:App52="clr-namespace:App52;assembly=App52"x:Class="App52.MainPage"x:Name="Root"><ContentPage.BindingContext><App52:MainPageViewModel /></ContentPage.BindingContext><ListView ItemsSource="{Binding Items}"><ListView.ItemTemplate><DataTemplate><ViewCell><StackLayout Orientation="Horizontal"><Label Text="{Binding}" /><Button Text="Alert"Command="{Binding Source={x:Reference Root}, Path=BindingContext.AlertCommand}"CommandParameter="{Binding}" /></StackLayout></ViewCell></DataTemplate></ListView.ItemTemplate></ListView></ContentPage>

x:Referenceでページ自体をSourceに指定して、そこからVMのCommandをPathで指定しています。あとは、CommandParameterに渡したい要素をBindingしてやるだけ。これで動くようになります。めでたしめでたし。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>