XAML in Xamarin.Forms 基礎篇 電子書

特別說明

2017/02/12

Xamarin FAQ 2-11 : 在ListView內,如何指定檢視模型內的ICommand做綁定

問題

若使用 Code Behind 的方式來解決使用者點選 ListView 控制項的時候,要觸發某個事件,可以在 Code Behind 程式碼中訂閱 ItemSelected 這個事件,可是,若採用 MVVM 價購方式開發,不想要使用 Code Behind 的方式來訂閱這個事件,而是想要綁定 ICommand 命令,這個時候,該如何處理呢?

解答

這個時候,您可以使用 Xamarin.Forms 內建的 Behavior 功能,每個 Xamarin.Forms 的控制項,都可以使用 Behaviors 屬性,可以用來定義相關擴充行為;不過,要綁定 ListView 的點擊某筆紀錄的事件,這個時候,我們需要使用一個 NuGet 套件:Behaviors.Forms
在底下的 XAML 宣告中,宣告了一個額外命名空間 xmlns:behaviors="clr-namespace:Behaviors;assembly=Behaviors",透過 behaviors 這個命名空間,可以取得與使用這個 Behavior NuGet 套件的相關擴充行為功能;所以,您可以在底下看到宣告了 <ListView.Behaviors> 屬性,使用了 InvokeCommandAction 這個方法,綁定了當 ListView 控制項有這個 ItemTapped 事件發生的時候,就會去執行這個 ViewModel 內的 MyDataClickedCommand 命令。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             xmlns:behaviors="clr-namespace:Behaviors;assembly=Behaviors"
             x:Class="XFListView.Views.ItemClickPage"
             Title="ListView 點選與取消選取">

  <StackLayout>
    <ListView x:Name="listview"
      ItemsSource="{Binding MyData}"
      SelectedItem="{Binding MyDataSelected, Mode=TwoWay}"
      Margin="20,0"
      IsPullToRefreshEnabled="True"
              RefreshCommand="{Binding 更新資料Command}"
              IsRefreshing="{Binding IsBusy, Mode=TwoWay}"
      >
      <ListView.Behaviors>
        <behaviors:EventHandlerBehavior EventName="ItemTapped">
          <behaviors:InvokeCommandAction Command="{Binding MyDataClickedCommand}"  />
        </behaviors:EventHandlerBehavior>
      </ListView.Behaviors>
Xamarin-跨平台手機應用程式設計入門-粉絲團

沒有留言:

張貼留言