2017-04-01 10 views
0

I次のコードを持っている:私は以下のように左右にスワイプジェスチャーにgetRandomWordsを呼び出すことができるようにしたい私のカスタムレンダラでXamarin Formsカスタムレンダラ内のビューからメソッドにアクセスするにはどうすればいいですか?

public partial class PhrasesFrameRendererClass : Frame 
{ 
    ..... 
    void getRandomWords() { 
     // more code here that involves getting random numbers 
     // and updating a grid's bindingcontext 
    } 
} 

:これが可能である

public class PhraseFrameCustomRenderer : FrameRenderer 
{ 
    UISwipeGestureRecognizer leftSwipeGestureRecognizer; 
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e) 
    { 
     base.OnElementChanged(e); 
     leftSwipeGestureRecognizer = new UISwipeGestureRecognizer(); 
     leftSwipeGestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Left; 
     leftSwipeGestureRecognizer.NumberOfTouchesRequired = 1; 
     leftSwipeGestureRecognizer.AddTarget((obj) => 
     { 
      // Call getRandomWords() here 
     }); 
    } 
} 

を?どのようにこれを行うことができるかに関する任意のアイデア?

答えて

1
base.OnElementChanged(e); 
    leftSwipeGestureRecognizer = new UISwipeGestureRecognizer(); 
    leftSwipeGestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Left; 
    leftSwipeGestureRecognizer.NumberOfTouchesRequired = 1; 
    leftSwipeGestureRecognizer.AddTarget((obj) => 
    { 
     // Call getRandomWords() here 
     var frame = Element as PhrasesFrameRendererClass ; 
     if(frame!=null){ 
      frame.getRandomWords(); 
     } 
    }); 
0

あなたのレンダラからそのコマンドを呼び出し、コマンドとして

//Your custom control in your PCL project 
public partial class PhrasesFrameRendererClass : Frame 
{ 
    public static readonly BindableProperty SwipeLeftCommandProperty = 
    BindableProperty.Create(nameof(SwipeLeftCommand), typeof(ICommand), typeof(PhrasesFrameRendererClass), null); 

    public ICommand SwipeLeftCommand 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 
} 

//Your custom control renderer 
public class PhraseFrameCustomRenderer : FrameRenderer 
{ 
    UISwipeGestureRecognizer leftSwipeGestureRecognizer; 
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e) 
    { 
     base.OnElementChanged(e); 
     leftSwipeGestureRecognizer = new UISwipeGestureRecognizer(); 
     leftSwipeGestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Left; 
     leftSwipeGestureRecognizer.NumberOfTouchesRequired = 1; 
     leftSwipeGestureRecognizer.AddTarget((obj) => 
     { 
      var myFrame = Element as PhrasesFrameRendererClassl 
      if(myFrame != null){ 
       if(myFrame.SwipeLeftCommand != null && myFrame.SwipeLeftCommand.CanExecute()){ 
        myFrame.SwipeLeftCommand.Execute(); 
       } 
      } 
     }); 
    } 
} 

//Your ViewModel 
public class PhrasesViewModel{ 

    public Command GetRandomWordsCommand {get;set;} 

    public PhrasesViewModel(){ 
     GetRandomWordsCommand = new Command(ExecuteGetRandomWords); 
    } 

    private void ExecuteGetRandomWords(){ 

    //Your method goes here 

    } 

} 

//Your XAML 
<yourControls:PhrasesFrameRendererClass SwipeLeftCommand="{Binding GetRandomWordsCommand }"/> 

をあなたのViewModelのgetRandomWordsメソッドをバインドすることがこの方法をより複雑に見えるかもしれませんが、カスタムフレームクラスのTYPEコマンドのBindablePropertyを作成することができますコマンドを使用すると、レンダリングコードからアプリケーションコード(ランダムフレーズを取得するなど)を分離することができます

関連する問題