0

我正在使用自定义视图单元格和渲染器实施滑动删除功能。我有一个列表视图,像这样:如何获得Xamarin形式列表视图重置自定义视图单元格后删除Android上?

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

和刷卡的时候,一个按钮则透露,如下

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

但是,单击删除按钮(成功地消除了项目之后从列表中)移动到删除单元格位置的视图单元格仍然具有删除按钮:

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

任何人有任何想法如何阻止这种情况发生?我的自定义渲染器只是公开OnFling()和OnScroll()事件。

我也尝试过使用Xamarin形式的Pan Gesture Recogniser类似的东西,并遇到同样的问题。

EDIT 1:添加代码片段

自定义视图细胞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> 

定制视图细胞。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); 
    } 

} 

视图模型:

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

你能p租赁添加你的代码?我可以给你一个很好的解决方案 –

+0

@MikeDarwish我已经添加了一些片段 – DParry

回答

-1

在下面的完整的示例,你如何能做到这一点,它的工作对我罚款:

1-添加一个类包含一个数字已经显示在您的清单视图

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

2,尽量使用ObservableCollectionNumberClass如下所示:

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,把你的电话号码名单上List<NumberClass>

public List<NumberClass> allItems; 

4 - 使用NumberClassList如下所示:

NumberClassList items; 
    items = new NumberClassList(allItems); 

5设置的项目来源为您ListView如下所示:

ItemsSource = items.Items; 

为您ListView 6 - 创建DataTemplate如下: 注:删除按钮和号码相同的结合

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 - 这是一个删除按钮的实现:

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

我可以删除东西很好,问题是替换已删除行的项目有其自动公开的“删除”区域。 – DParry

相关问题