2016-08-11 5 views
2

まず、私の英語はすみません。 私はこれがあるのICommandXamarin再利用xamlユーザーコントロールとカスタムコマンド

と私は別の方法で再利用可能な「XAMLユーザーコントロール」を持ちたい、と私はそれをクリッカブルにする必要がありXamarin.Form

を使用してiOSとAndroidのプロジェクトに取り組んでいます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> 

これは

<?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のXAMLページです電子CalendarioPage C#のページ:単純なクラスで活性を有する

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); } 
     }   
    } 
} 

::これはのviewmodelクラスです

public partial class CalendarioPage : ContentPage 
{ 
    private CalendarioViewModel vm; 

    public CalendarioPage() 
    { 
     InitializeComponent(); 

     vm = new CalendarioViewModel(); 

     this.BindingContext = vm; 
    } 
} 

今まで

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' メソッドに追加してみてください。

Into Activity.cs 'ICommand tapCommand'と関連するget ...を追加しますが、機能しません。

他にも試してみましたが、StackLayoutButtonコンポーネントのタップを有効にすることはできません。

どうすればいいですか? 私は 'プログラム可能な'コマンドを持っていたいと思っています。たとえば、アクティビティのリンクプロパティを参照したり、新しいビューを開くことができます。

ありがとうございました!

更新:

私は(StackLayoutButton.xaml.cs)、 XAMLのユーザーコントロールにTapGestureRecognizerを追加することができましたが、私は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> 

そして、これは私のViewModelでのICommandプロパティです:

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

    private async Task SelectEquipmentTask() 
    { 

    } 
関連する問題