Xamarin Forms ListView Binding

Xamarin Forms 如何Binding列表中的按鈕

張阿鬼 2017/12/12 16:56:57
1952

Xamarin Forms 如何Binding列表中的按鈕


簡介

如何在ListView中Binding 按鈕

作者

張朝銘


1.     前言

 

l   本文件用來提供Xamrin Forms開發人員開發ListView應用

l   開發工具使用Visual Studio 2017

l   適合Xamarin Forms進階開發者


 2.     目的

Xamarin Forms ListView 中,進行 Button Binding 應用 

 3.     本文

APP開發中列表是常使用的控制項,有時在列表內我們會放入按鈕,當使用者按下後再對應其功能,本文將透過ViewView Binding的技巧讓ButtonBinding回到當頁的ViewMode上。

  3.1  建立含有按鈕的ListView ItemTemplate

       首先準備含有ListView相關的XAML內容,並建立一個含有Button的ItemTemplate如下:

    <ListView ItemsSource="{Binding Items}" >

        <ListView.ItemTemplate>

            <DataTemplate>

                <ViewCell>

                    <StackLayout Orientation="Horizontal">

                        <Label Text="{Binding Value}" HorizontalOptions="FillAndExpand"/>

                        <Button Text="按我"/>

                    </StackLayout>

                </ViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>

    </ListView>

        ListView會讀取ViewModel中的Items屬性作為資料來源,列表中的資料則是會讀取
       
ViewModel中的Value屬性顯示。

        接著建立該頁面使用的ViewModel與列表中資料所使用的ViewModel

 

3.2建立ViewModel

接著建立該頁面使用的ViewModel與列表中資料所使用的ViewModel,在頁面使用的ViewModel建構子內,同時初始化要展現的集合資料。如下XAML片段:

MainViewModel為該頁面使用:

 

    public class MainViewModel

    {

        public List<ItemViewModel> Items { get; set; }

        public MainViewModel()

        {

            this.Items = new List<ItemViewModel>();

            for (int i = 1; i <= 100; i++)

                this.Items.Add(new ItemViewModel() { Value = $"我是第{i}" });

        }

    }

ItemViewModel為資料集合使用:

    public class ItemViewModel

    {

        public string Value { get; set; }

    }

呈現以下結果畫面:

  3.3  建立Button Binding

正常情況下Button的點擊Binding會對應到其ViewModel中,但通常我們的需求是需要在頁面的ViewModel取得哪一個Item被點擊了,因此需要利用View and View Binding的技巧將點擊事件轉到MainViewModel上。

首先在MainViewModel中建立將會由Button觸發的Command,並在建構子建立其方法,如下程式碼片段所示:

 

        public ICommand OnClick

        {

            get

            {

                if (this.onClick == null)

                    this.onClick = new Command<ItemViewModel>(item =>

                      {

                          PageHelper.Alert("提示", $"您按下了{item.Value}");

                      });

                return this.onClick;

            }

        }

        private ICommand onClick;

 

Command會傳入被按下的Item代表的ViewModel,意即在該ButtonCommand參數會把ViewModel傳入。使用ViewView Binding的技巧,將Button 本身BindingSource換成ListViewBindingContext,而CommandParameter使其BindingDataTemplateStackLayout上,最後將Command Binding到前述所建立的OnClick上。

 

最後完成的ListViewXAML內容如下

   

    <ListView x:Name="list" ItemsSource="{Binding Items}" >

        <ListView.ItemTemplate>

            <DataTemplate>

                <ViewCell>

                    <StackLayout Orientation="Horizontal" x:Name="stLayout">

                        <Label Text="{Binding Value}" HorizontalOptions="FillAndExpand"/>

                        <Button Text="按我"  

                                BindingContext="{

                                    Binding Source={x:Reference list},

                                    Path=BindingContext }" 

                                CommandParameter="{

                                    Binding Source={x:Reference stLayout},

                                    Path=BindingContext}"

                                Command="{Binding  OnClick}"/>

                    </StackLayout>

                </ViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>

    </ListView>

 

完成圖示


 4.     範例連結與參考來源

張阿鬼