2017-07-06 12 views
-1

リストビューのアイテムをタップして別のビューを開こうとしています。 私はTapGestureRegonizerを追加しようとしましたが、グリッドなどでViewCellを追加することさえできました。これらのどれもうまくいかないようです。私はラベルにタップジェスチャーを追加したが、それは動作するように見えたが、同じものはリストビュー項目では機能しない。これはリストビューのようなものにとっては単純な問題のように思えますが、このための機能は組み込まれていないようです。リストビューアイテムのジェスチャーをタップ

XAML:背後

<ListView x:Name="dataList" 
     ItemsSource="{Binding routeLabels}" 
     HasUnevenRows="True" 
     Grid.Row="1" 
     Grid.Column="0" 
     Grid.ColumnSpan="3"> 
</ListView> 

コード:

var listviewgesture = new TapGestureRecognizer(); 
listviewgesture.SetBinding(TapGestureRecognizer.CommandProperty,"LoadRoutePage"); 
dataList.GestureRecognizers.Add(listviewgesture); 

ビューモデル:

public ICommand LoadRoutePage { get; protected set; } 



public DriverDashboardViewModel(INavigation navigation,MessagDatabase database) 
    { 
     this._database = database; 
     this.Navigation = navigation; 
     this.LoadNotifications = new Command(async() => await OpenNotificationsPage()); 
     this.LoadRoutePage = new Command(async() => await OpenRoutePage()); 

    } 

public async Task OpenRoutePage() 
    { 

     await Navigation.PushAsync(new RoutePageView()); 
    } 

だけLoadNotifications方法は、ページを開くに仕事をして明確にすることが、 LoadRoutePageはありません。だから私は、ビューとビューモデルの間にある程度のコミュニケーションがあることを知っています。

答えて

5

ListViewにを追加しないでください。すべてのセルには既にタップを処理するイベントがあり、GestureRecognizerはタップが何をすべきかに関しておそらくはListViewを混乱させます。これについてはいくつかの方法があります。

1のSelectedItemはListView

バインドにSelectedItemプロパティを結合し、そのプロパティのセッターでのメソッド呼び出しを処理します。

<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}" 
      HasUnevenRows="True" Grid.Row="1" Grid.Column="0"   
      Grid.ColumnSpan="3" SelectedItem="{Binding SelectedItem}"> 
</ListView> 

そして、あなたのviewmodelで:

string _selectedItem; 

public string SelectedItem { 
    get {return _selectedItem; } 
    set 
    { 
     _selectedItem = value; 
     // Additional code 
    } 
} 

2.イベントに建てられたが

ListViewをItemSelectedかItemTappedあなたはItemSelectedItemTappedという名前をフックすることができますいくつかのイベントがあります。これらはコードビハインドで捕らえることができ、達成しようとしていることを処理できます。あなたがそれらがUI側で処理しているので、あなたが理想的にこれらのイベントを望んでいないのviewmodelsを使用するための行動

との結合を指令する

<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}" 
      HasUnevenRows="True" Grid.Row="1" Grid.Column="0"   
      Grid.ColumnSpan="3" ItemSelected="Handle_ItemSelected" ItemTapped="Handle_ItemTapped"> 
</ListView> 

3.イベント。そこにあなたのビューモデルで処理できるコマンドにイベントを翻訳できるNuGetパッケージがあります。例えばCorcav.Behaviorsを見てください。

4.次のようになり、私は定期的に使用する私は1つを持っているあなた自身の

の振る舞いを作成します。

public class ListViewSelectedItemBehavior : Behavior<ListView> 
{ 
    public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(ListViewSelectedItemBehavior)); 

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

    public ListView AssociatedObject { get; private set; } 

    protected override void OnAttachedTo(ListView bindable) 
    { 
     base.OnAttachedTo(bindable); 
     AssociatedObject = bindable; 
     bindable.BindingContextChanged += OnBindingContextChanged; 
     bindable.ItemSelected += OnListViewItemSelected; 
    } 

    protected override void OnDetachingFrom(ListView bindable) 
    { 
     base.OnDetachingFrom(bindable); 
     bindable.BindingContextChanged -= OnBindingContextChanged; 
     bindable.ItemSelected -= OnListViewItemSelected; 
     AssociatedObject = null; 
    } 

    private void OnBindingContextChanged(object sender, EventArgs e) 
    { 
     OnBindingContextChanged(); 
    } 

    private void OnListViewItemSelected(object sender, SelectedItemChangedEventArgs e) 
    { 
     if (Command == null) 
      return; 

     if (Command.CanExecute(e.SelectedItem)) 
      Command.Execute(e.SelectedItem); 
    } 

    protected override void OnBindingContextChanged() 
    { 
     base.OnBindingContextChanged(); 
     BindingContext = AssociatedObject.BindingContext; 
    } 
} 

にこれを追加するには、あなたのListViewあなたは、単にそれに動作を追加します:

<ListView x:Name="dataList" ItemsSource="{Binding routeLabels}" 
      HasUnevenRows="True" Grid.Row="1" Grid.Column="0"   
      Grid.ColumnSpan="3"> 
    <ListView.Behaviors> 
     <behaviors:ListViewSelectedItemBehavior Command="{Binding ItemSelectedCommand}" /> 
    </ListView.Behaviors> 
</ListView> 

この場合、ItemSelectedCommandはViewModelのコマンドオブジェクトです。

+0

は、私はあなたに感謝し、これらを見て、あなたが知っているだろう。 – user3355961

+0

オプション1ではRoute _selectedItemというプロパティがありますが、そのタイプはどのようなものですか? Im sure not – user3355961

+0

これはListViewにバインドされているアイテムの種類です。コードがルートを含むListViewを参照するので、ListViewにバインドされたアイテムはRouteオブジェクトであると仮定しました。たとえば、文字列のリストは 'string'に変更されます。 –

0

私はあなたを正しく理解していますが、誰かがリストビューの要素をタップしたときにイベントを取得しようとしているのかどうかわかりませんか?あなたが認識器を必要としないので、あなたは、単にあなたのXAMLでItemTappedを追加する必要がある場合

:これはあなたのためのイベントを生成します

<ListView x:Name="dataList" 
     ItemsSource="{Binding routeLabels}" 
     HasUnevenRows="True" 
     Grid.Row="1" 
     Grid.Column="0" 
     ItemTapped="Name of event" 
     Grid.ColumnSpan="3"> 
</ListView> 

(ちょうどダブルタブItemTappedを作成しています)とあなたをここにあなたのコードを置くことができます

0

イベントではなくコマンドを「タップ」イベントにバインドしています。このような何かを試してみてください:

コードの背後にある:

var listviewgesture = new TapGestureRecognizer(); 
listviewgesture.Tapped += Handle_listViewItemTapped; 
dataList.GestureRecognizers.Add(listviewgesture); 

のViewModel:

private void Handle_listViewItemTapped(object sender, EventArgs e) 
{ 
    viewModel.OpenRoutePage(); 
} 
関連する問題