0

J'implémente un balayage pour supprimer la fonctionnalité à l'aide d'une cellule de vue personnalisée et d'un moteur de rendu. J'ai vue la liste comme ceci:Comment faire pour obtenir l'affichage de la liste des formulaires Xamarin pour réinitialiser la cellule de vue personnalisée après suppression sur android?

https://i.stack.imgur.com/AzBQk.png

et quand chipé, un bouton est révélé, comme ci-dessous

https://i.stack.imgur.com/S87uj.png

Cependant, après avoir cliqué sur le bouton de suppression (qui supprime l'élément avec succès à partir de la liste) la cellule de vue qui s'est déplacée à la position de la cellule de suppression a toujours le bouton de suppression exposé:

https://i.stack.imgur.com/aMwux.png

Quelqu'un a-t-il une idée sur la façon de l'empêcher? Mon moteur de rendu personnalisé expose simplement les événements OnFling() et OnScroll().

J'ai également essayé une chose similaire en utilisant le formulaire de reconnaissance de gestes Pan de Xamarin et j'ai rencontré le même problème.

EDIT 1: Ajout de code snippets

Vue personnalisée cellule XAML

<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="SwipeViewCell" xmlns:local="CustomControls"> 
<Grid x:Name="SwipeViewCellGrid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="70*"/> 
     <ColumnDefinition Width="30*"/> 
    </Grid.ColumnDefinitions> 
    <StackLayout x:Name="HiddenContainer" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Column="1"/> 
    <local:GestureStackLayout x:Name="SwipeContainer" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.ColumnSpan="2" Grid.Column="0"/> 
</Grid> 

personnalisés Voir Cell.cs:

public partial class SwipeViewCell : ViewCell 
{  

    private View _swipeContent; 
    private View _hiddenContent; 


    public SwipeViewCell() 
    { 
     InitializeComponent(); 

     SwipeContainer.SwipeLeft += SwipeContainer_SwipeLeft; 
     SwipeContainer.SwipeRight += SwipeContainer_SwipeRight; 
    } 

    public View SwipeContent 
    { 
     get 
     { 
      return _swipeContent; 
     } 
     set 
     { 
      _swipeContent = value; 
      SwipeContainer.Children.Add(SwipeContent); 
      OnPropertyChanged(); 
     } 
    } 

    public View HiddenContent 
    { 
     get 
     { 
      return _hiddenContent; 
     } 
     set 
     { 
      _hiddenContent = value; 
      HiddenContainer.Children.Add(HiddenContent); 
      OnPropertyChanged(); 
     } 
    } 

    private void SwipeContainer_SwipeRight(object sender, EventArgs e) 
    { 
     SwipeContainer.TranslateTo(SwipeContainer.X, 0, 250, Easing.Linear); 
    } 

    private void SwipeContainer_SwipeLeft(object sender, EventArgs e) 
    { 
     SwipeContainer.TranslateTo(SwipeContainer.X - HiddenContainer.Width, 0, 250, Easing.Linear); 
    } 

} 

Voir Modèle:

public class ViewModel 
{ 

    private ObservableCollection<string> _data;  

    public ViewModel() 
    { 
     Data = new ObservableCollection<string>(); 
     Data.Add("a"); 
     Data.Add("c"); 
     Data.Add("b"); 
    } 

    public ObservableCollection<string> Data 
    { 
     get { return _data; } 
     set 
     { 
      _data= value; 
      OnPropertyChanged(); 
     } 
    } 

    public ICommand Delete 
    { 
     get 
     { 
      return new Command((e) => 
      { 
       _data.Remove(e as string);      
       Data = _data 
      }); 
     } 
    } 

} 

XAML:

<ListView ItemsSource="{Binding Data}" x:Name="Model" HorizontalOptions="FillAndExpand" IsVisible="True" VerticalOptions="FillAndExpand" SeparatorVisibility="Default" SeparatorColor="Black"> 
       <CustomControls:MultiListView.ItemTemplate> 
        <DataTemplate>      
          <CustomControls:SwipeViewCell x:Name="Item"> 
           <CustomControls:SwipeViewCell.SwipeContent> 
            <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" BackgroundColor="White"> 
             <Label Text="{Binding }"/> 
            </StackLayout> 
           </CustomControls:SwipeViewCell.SwipeContent> 
           <CustomControls:SwipeViewCell.HiddenContent> 
            <Button Text="Delete" Command="{Binding Delete}" BindingContext="{Binding Source={x:Reference Model}, Path=BindingContext}" CommandParameter="{Binding Source={x:Reference Item}, Path=BindingContext}" BackgroundColor="Red"></Button> 
           </CustomControls:SwipeViewCell.HiddenContent> 
          </CustomControls:SwipeViewCell>       
        </DataTemplate> 
       <ListView.ItemTemplate> 
      <ListView> 
+0

pourrait vous p bail ajouter votre code? Je peux vous donner une bonne solution –

+0

@MikeDarwish J'ai ajouté quelques extraits – DParry

Répondre

-1

Sur ce qui suit l'exemple complet, comment vous pouvez le faire, il fonctionne bien pour moi:

1- Ajouter une classe contient un nombre affiché sur votre liste.

public class NumberClass 
    { 
     public string Number{ get; set; } 
    } 

2-essayez d'utiliser ObservableCollection pour NumberClass comme suit:

public class NumberClassList : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     public System.Collections.ObjectModel.ObservableCollection<NumberClass> _items; 
     public ObservableCollection<NumberClass> Items 
     { 
      get { return _items; } 
      set { _items = value; OnPropertyChanged("Items"); } 
     } 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged == null) 
       return; 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public SerialClassList(List<NumberClass> itemList) 
     { 
      Items = new ObservableCollection<NumberClass>(); 
      foreach (NumberClassitm in itemList) 
      { 
       Items.Add(itm); 
      } 
     } 
    } 

3-mettre votre liste de numéro sur List<NumberClass>

public List<NumberClass> allItems; 

4-utilisation NumberClassList comme suit:

NumberClassList items; 
    items = new NumberClassList(allItems); 

5 définir l'élément Source pour la votre ListView comme suit:

ItemsSource = items.Items; 

6-Créer une DataTemplate pour votre ListView comme suit: Notes: Supprimer Bouton et numéro ont le même liant

DataTemplate dt = new DataTemplate(() => 
      { 
       var Number = new Label 
       { 
        TextColor=Color.Black, 
        FontAttributes=FontAttributes.Bold, 
        HorizontalOptions = LayoutOptions.StartAndExpand 
       }; 
       Number.SetBinding(Label.TextProperty, new Binding("Number")); 
       var Deletebutton = new Button { Text = "Delete", HorizontalOptions = LayoutOptions.StartAndExpand }; 
       Deletebutton.SetBinding(Button.CommandParameterProperty, new Binding("Number")); 
       Deletebutton.Clicked += DeleteSerial; 
       return new ViewCell 
       { 
        View = new StackLayout 
        { 
         Orientation = StackOrientation.Horizontal, 
         VerticalOptions = LayoutOptions.FillAndExpand,       
         Children = 
         { 
          Number, 
          Deletebutton 
         } 
        } 
       }; 
      }); 
YourListView.ItemTemplate = dt; 

7 c'est la mise en œuvre pour le bouton Supprimer:

public void DeleteSerial(object sender,EventArgs e) 
      { 
       var item = (Xamarin.Forms.Button)sender; 
       SerialClass listitem = (from itm in items.Items 
             where itm.Number == item.CommandParameter.ToString() 
          select itm) 
          .FirstOrDefault<SerialClass>(); 
      items.Items.Remove(listitem);    
     } 
+0

Je peux supprimer des choses très bien, le problème est que l'élément qui remplace la ligne supprimée a sa région «supprimer» exposée automatiquement. – DParry