2017-12-19 35 views
0

MVMS 패턴을 사용하는 내 xamarin.forms 응용 프로그램에서 ListView에 문제가 있습니다. 네가 나를 도울 수 있기를 바랍니다. 당신이 볼 수 있듯이Button 명령에서 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에 대한 참조로 전달하십시오. 그러면 항목보기 모델에서 쉽게 제거 할 수 있습니다. – 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