2017-01-23 3 views
0

iOSスワイプイベントから、ViewCellにバインドされたモデルデータに戻る方法を理解しようとしています(モデルは、簡単なPOCO)。私はサブクラス化StackLayoutを使用していますXamarinフォーム - スワイプに応答しているときにカスタムレンダラからデータバインドされたオブジェクトを見つける

...カスタムレンダラと

public class MainPageStackLayout : StackLayout { } 

...

[assembly: ExportRenderer(typeof(MainPageStackLayout), typeof(MainPageStackLayoutRenderer))] 

namespace DriveLive.iOS 
{ 
    public class MainPageStackLayoutRenderer : VisualElementRenderer<StackLayout> 
    { 
     UISwipeGestureRecognizer swipeGestureRecognizer; 

     protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e) 
     { 
      base.OnElementChanged(e); 

      swipeGestureRecognizer = new UISwipeGestureRecognizer(() => 
      { 
       //******************** 
       Console.WriteLine("How to access the underlying model here?"); 
       //******************** 
      }) { Direction = UISwipeGestureRecognizerDirection.Left, NumberOfTouchesRequired = 1 }; 

      if (e.NewElement == null) 
      { 
       if (swipeGestureRecognizer != null) 
        this.RemoveGestureRecognizer(swipeGestureRecognizer); 
      } 

      if (e.OldElement == null) 
      { 
       this.AddGestureRecognizer(swipeGestureRecognizer); 
      } 
     } 
    } 
} 

とMainPageStackLayoutを使用するコード...

<?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:local="clr-namespace:DriveLive" 
      x:Class="DriveLive.Views.MainPage"> 

    <ListView x:Name="___drives" HasUnevenRows="True"> 
    <ListView.ItemTemplate /> 
    </ListView> 
</ContentPage> 

C#

public partial class MainPage : ContentPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     IDriveRespository repo = new DriveLive.Repository.Fakes.DriveRespository(); 
     ___drives.ItemsSource = repo.GetDrivesForUser(45); // returns a Drive list of objects 
     ___drives.ItemTemplate = new DataTemplate(typeof(CustomViewCell)); 
     ___drives.SeparatorColor = Color.FromHex("#81C1B5"); 
    } 
} 

public class CustomViewCell : ViewCell 
{ 
    bool _initialized = false; 
    StackLayout _cellStack; 

    public CustomViewCell() 
    { 
     _cellStack = new MainPageStackLayout() 
     { 
      Orientation = StackOrientation.Vertical, 
      HorizontalOptions = LayoutOptions.FillAndExpand 
     }; 
     View = _cellStack; 

     var label = new Label() { FontAttributes = FontAttributes.Bold }; 
     label.SetBinding(Label.TextProperty, new Binding("DestinationName")); 
     _cellStack.Children.Add(label); 
    } 
} 

UISwipeGestureRecognizerのハンドラから、ViewCellにデータバインドされている基礎となるドライブオブジェクトにどのようにアクセスできますか?

+0

スワイプで達成しようとしていることを聞くことはできますか? – skar

+0

モデルにいくつかのプロパティを設定する必要があります。 –

+1

スワイプが行われたときにモデルにプロパティを設定する必要がある場合は、スワイプジェスチャ認識機能をそのまま使用する必要があります。しかし、ジェスチャ認識機能をStackLayoutの代わりにListViewに配置する必要があります。次に、ジェスチャー認識機能の 'LocationInView()'メソッドとUITableViewの 'IndexPathForRowAtPoint()'を使って、スワイプされた行を見つけてモデルにフィードバックします。 – skar

答えて

0

この問題を解決するには、このXFormsを活用してください。

ListView Interactivity - Context Actions

クレジットは正しい方向に私を指しているため、@のSKÄRさんのコメントになります。

関連する問題