2017-12-19 15 views
0

MVVMパターンを使用するxamarin.formsアプリケーションのListViewに問題があります。あなたが私を助けてくれることを願います。あなたが見ることができるようにボタンコマンドからリストビューを取得するxamarin.forms MVVM

private ICommand _deleteVolumeCommand; 
    public ICommand DeleteVolumeCommand 
    { 
     get 
     { 
      { 
       if (_deleteVolumeCommand == null) 
       { 
        _deleteVolumeCommand = new Command((e) => 
        { 
         var item = (e as Volume); 
         int index = MissingVolumeListView.Items.IndexOf(item);      
        }); 
       } 

       return _deleteVolumeCommand; 
      } 

     } 
    } 

、私がしたいことは、私は私のListViewコントロールのボタンをクリックすると、項目を選択し得ることです:

<ListView x:Name="MissingVolumeListView" 
          ItemsSource="{Binding Volumes}" 
          SelectedItem ="{Binding Id}" 
          > 
          <ListView.ItemTemplate> 
           <DataTemplate> 
            <ViewCell> 
             <Grid x:Name="Item"> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="*"/> 
               <ColumnDefinition Width="40"/> 
              </Grid.ColumnDefinitions> 
              <Label Text="{Binding Name}" Style="{StaticResource UsualLabelTemplate}"/> 
              <Button Grid.Column="1" x:Name="DeleteButton" Text ="-" BindingContext="{Binding Source={x:Reference MissingVolumeListView}, Path=BindingContext}" Command="{Binding DeleteVolumeCommand}" CommandParameter="{Binding Source={x:Reference Item}, Path=BindingContext}"/> 
             </Grid> 
            </ViewCell> 
           </DataTemplate> 
          </ListView.ItemTemplate> 
         </ListView> 

は、その後、私は私のViewModelにDeleteVolumeCommandを得る: はここに私のXAMLです。その後、私はすべての

+0

x:Nameの使用法はMVVMパターンではありません。これを回避してください。 deleteコマンドはあなたのlistitemのビューモデル上にあります。正しいのですか? viewmodelsでリストを作成するときは、そのリストをviewmodelへの参照として渡します。その後、アイテムviewmodelで簡単に削除できます。 – Csharpest

答えて

3

まずあなたの削除ボタンのXAMLを変更するあなたの助けをありがとう、私のListView

からそれを削除するには、選択した項目のインデックスを取得するために私のリストビューを取得したいです。

<Button Grid.Column="1" 
     Text ="-" 
     Command="{Binding Path=BindingContext.DeleteVolumeCommand, Source={x:Reference MissingVolumeListView}}" 
     CommandParameter="{Binding .}" /> 

コマンドは、バインディングコンテキストをリストビュー名でビューモデルに変更する必要があります。

しかし、コマンドパラメータは、リストビューアイテムである現在のバインディングを渡すことができます。

ビューモデルでは、名前でコントロールを参照することはできません。代わりに、リストビューにItemsSourceがバインドされているリストを使用します。

アイテムを直接削除できます。

_deleteVolumeCommand = new Command((e) => 
{ 
    var item = (e as Volume); 
    Volumes.Remove(item);      
}); 

VolumesがObservableCollectionでない場合は、notifyプロパティも変更してください。

+0

それはまさに、ありがとうございます。 – Fifou

関連する問題