2016-08-11 65 views
2

首先感謝我的英語。 我使用Xamarin.FormXamarin可重複使用的xaml用戶控件和自定義命令

一個iOS和Android項目的工作,我想有一個「XAML用戶控制」在不同的方式重複使用,我需要使它與點擊的ICommand

這是StackLayoutButton組分:

<?xml version="1.0" encoding="utf-8" ?> 
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
x:Class="Installa.Controls.StackLayoutButton"> 
    <Image x:Name="Icon" Source="{Binding Icon}" /> 
    <Label x:Name="Text" Text="{Binding Title}" HorizontalOptions="Center" LineBreakMode="NoWrap" Font="Small" TextColor="Red" /> 
</StackLayout> 

這在CalendarioPage 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:controls="clr-namespace:Installa.Controls;assembly=Installa" 
      x:Class="Installa.CalendarioPage"> 

    <StackLayout> 
    <Label Text="{Binding ViewName}" Font="42" IsVisible="{Binding IsWindowsPhone}" /> 
    <ActivityIndicator IsRunning="{Binding IsLoading}" IsVisible="{Binding IsLoading}" Color="Red" /> 

    <controls:StackLayoutButton BindingContext="{Binding Blog}" TextColor="Blue" /> <!-- Command="{Binding SubmitCommand}" --> 
    <controls:StackLayoutButton BindingContext="{Binding Facebook}" TextColor="Red" /> <!-- Command="{Binding SubmitCommand}" --> 
    </StackLayout> 

</ContentPage> 

這是個ËCalendarioPage C#頁:

public partial class CalendarioPage : ContentPage 
{ 
    private CalendarioViewModel vm; 

    public CalendarioPage() 
    { 
     InitializeComponent(); 

     vm = new CalendarioViewModel(); 

     this.BindingContext = vm; 
    } 
} 

這是ViewModel類:

namespace Installa 
{ 
    public class CalendarioViewModel: BaseViewModel 
    { 

     public CalendarioViewModel() 
     { 
      blog = new Activity(); 
      blog.Link = "www.google.it"; 
      blog.Title = "Titolo del blog"; 
      blog.Icon = "logomenu.png"; 

      facebook = new Activity(); 
      facebook.Title = "Tito Fbook"; 
      facebook.Link = "www.facebook.it"; 
      facebook.Icon = "icon.png"; 

      ViewName = "nome della view"; 
      IsLoading = false;  
     } 

     Activity blog = null; 
     public Activity Blog 
     { 
      get {return blog;} 
     } 

     Activity facebook = null; 
     public Activity Facebook 
     { 
      get { return facebook; } 
     } 

     string viewName = string.Empty; 
     public string ViewName 
     { 
      get { return viewName; } 
      set { SetProperty(ref viewName, value); } 
     } 

     public bool IsWindowsPhone 
     { 
      get 
      { 
       return Device.OS == TargetPlatform.WinPhone; 
      } 
     } 

     bool isLoading = false; 
     public bool IsLoading 
     { 
      get { return isLoading; } 
      set { SetProperty(ref isLoading, value); } 
     }   
    } 
} 

隨着活動的簡單類:

public string Title { get; set; } 

    public string Link { get; set; } 

    public String Icon { get; set; } 

目前爲止,所有的工作的權利,但現在我需要實現ICommand接口。

在StackLayoutButton C#代碼我嘗試添加:

 var tapGestureRecognizer = new TapGestureRecognizer(); 
     tapGestureRecognizer.SetBinding(TapGestureRecognizer.CommandProperty, "TapCommand"); 
     Icon.GestureRecognizers.Add(tapGestureRecognizer) 
     Text.GestureRecognizers.Add(tapGestureRecognizer) 

而且我嘗試添加到CalendarioViewModel INotifyPropertyChanged的和 'OnTapped' 的方法。

進入Activity.cs我添加'ICommand tapCommand'和相關的get ...但不工作。

我嘗試了其他..但我無法啓用StackLayoutButton組件的水龍頭。

我該怎麼辦? 我希望能夠有一個'可編程'命令...例如,我想瀏覽到'活動的鏈接屬性'或能夠打開一個新的視圖。

感謝您的幫助!

更新:

我能夠TapGestureRecognizer添加到XAML用戶控件(StackLayoutButton.xaml.cs), 但我想實現它在MVVM方式,

using Xamarin.Forms; 
namespace Installa.Controls 
{ 
    public partial class StackLayoutButton : StackLayout 
    { 
     public StackLayoutButton() 
     { 
      InitializeComponent(); 


      TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer 
      { 
       Command = new Command(OnMyComponentTapped), 
       CommandParameter = "ciao" 
      }; 
      this.Icon.GestureRecognizers.Add(tapGestureRecognizer); 
      this.Text.GestureRecognizers.Add(tapGestureRecognizer); 
     } 


     async void OnMyComponentTapped(object parameter) 
     { 
      // do action 
     } 


     public Color TextColor 
     { 
      get { return this.Text.TextColor; } 
      set { this.Text.TextColor = value; } 
     } 
     public Label TextControl 
     { 
      get { return this.Text; } 
      set { this.Text = value; } 
     } 
    } 
} 

能有人建議我的方式?

感謝

回答

0

這是我在我的XAML視圖中添加手勢識別:

<Label.GestureRecognizers> 
    <TapGestureRecognizer Command="{Binding SelectEquipmentCommand}"/> 
</Label.GestureRecognizers> 

而且這是在我的視圖模型的ICommand的屬性:

public ICommand SelectEquipmentCommand 
    { 
     get 
     { 
      return fSelectEquipmentCommand ?? (fSelectEquipmentCommand = new Command(async() => await SelectEquipmentTask())); 
     } 
    } 

    private async Task SelectEquipmentTask() 
    { 

    }