如何解决获取滑动项并将其 BindingContext 设置为空白 ListView
我有一个非常好用的列表视图,直到我尝试通过它的绑定上下文获取被刷过的项目并且它使列表视图显示为空白。在这背后的代码中,我可以访问该项目的数据,但是当我运行我的应用程序时,它会使列表视图变为空白...
列表视图
<ListView
x:Name="MyList"
Grid.Row="1"
HasUnevenRows="True"
HeightRequest="10"
BackgroundColor="White"
IsGroupingEnabled="True"
IsPullToRefreshEnabled="false"
ItemsSource="{Binding LogItems}"
IsRefreshing="{Binding IsBusy,Mode=OneWay}"
RefreshCommand="{Binding LoadLogsCommand}"
SeparatorVisibility="None"
>
<ListView.ItemTemplate>
<DataTemplate >
<ViewCell Height="70">
<StackLayout Orientation="Vertical" VerticalOptions="Start" >
<swipeview Swipestarted="swipeview_Swipestarted" x:Name="myswipeview" >
<Grid>
<Grid.RowDeFinitions>
<RowDeFinition Height="5"/>
<RowDeFinition Height="36"/>
<RowDeFinition Height="36"/>
<RowDeFinition Height="60"/>
</Grid.RowDeFinitions>
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="100"/>
<ColumnDeFinition Width="20"/>
<ColumnDeFinition Width="110"/>
<ColumnDeFinition Width="20"/>
<ColumnDeFinition Width="100"/>
<ColumnDeFinition Width="36"/>
</Grid.ColumnDeFinitions>
<Label
Grid.Row="1"
Grid.Column="0"
VerticalOptions="Center"
FontAttributes="None"
Text="{Binding .Name}"
TextColor="Black"
Margin="0,0"
Padding="20,10,0"
FontFamily="Hiragino Sans"
FontSize="14"
HeightRequest="53"
/>
...
</Grid>
</Grid>
<swipeview.RightItems>
<SwipeItems Mode="Reveal" SwipeBehaviorOnInvoked="Close" >
<SwipeItemView Invoked="OnDeleteSwipeItemInvoked" >
<StackLayout Orientation="Vertical" WidthRequest="200" BackgroundColor="Red">
<StackLayout HorizontalOptions="Start">
<Image Source="deleteIcon3.png" HeightRequest="25" WidthRequest="25" Margin="70,15,0" />
<Label Text=" Delete" TextColor="White" FontSize="15" HorizontalOptions="CenterandExpand" Margin="70,0"/>
</StackLayout>
</StackLayout>
</SwipeItemView>
</SwipeItems>
</swipeview.RightItems>
</swipeview>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
背后的代码
private void swipeview_Swipestarted(object sender,SwipeItemView e,SwipedEventArgs f,SwipeChangingEventArgs g) //SwipestartedEventArgs e)
{
// var theItem = (myLogsModel)f.SelectedItem;
var item = sender as SwipeItem;
var model = item.BindingContext as myLogsModel;
var x = model.Name; ...
}
请谁能帮助我如何在不影响我的列表视图的情况下获取被刷过的项目?
解决方法
从 Xamarin.Forms SwipeView 开始,我们可以看到 SwipeStarted 在开始滑动时被触发。伴随此事件的 SwipeStartedEventArgs 对象具有 SwipeDirection 属性,类型为 SwipeDirection。
因此您可以从 OnDeleteSwipeItemInvoked 方法获取当前列表视图项。
我做了一个样本,你可以看看:
<ListView ItemsSource="{Binding items}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<SwipeView>
<SwipeView.RightItems>
<SwipeItems>
<SwipeItemView Invoked="SwipeItemView_Invoked">
<StackLayout
BackgroundColor="Red"
Orientation="Vertical"
WidthRequest="200">
<StackLayout HorizontalOptions="Start">
<Image
Margin="70,15,0"
HeightRequest="25"
Source="delete.png"
WidthRequest="25" />
<Label
Margin="70,0"
FontSize="15"
HorizontalOptions="CenterAndExpand"
Text=" Delete"
TextColor="White" />
</StackLayout>
</StackLayout>
</SwipeItemView>
</SwipeItems>
</SwipeView.RightItems>
<!-- Content -->
<SwipeView.Content>
<Grid
BackgroundColor="LightGray"
HeightRequest="60"
WidthRequest="300">
<Label
HorizontalOptions="Center"
Text="{Binding title}"
VerticalOptions="Center" />
</Grid>
</SwipeView.Content>
</SwipeView>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
public partial class Page4 : ContentPage
{
public ObservableCollection<menuitem> items { get; set; }
public Page4()
{
InitializeComponent();
items = new ObservableCollection<menuitem>()
{
new menuitem(){title="title 1"},new menuitem(){title="title 2"},new menuitem(){title="title 3"},new menuitem(){title="title 4"},new menuitem(){title="title 5"},new menuitem(){title="title 6"}
};
this.BindingContext = this;
}
private void SwipeItemView_Invoked(object sender,EventArgs e)
{
SwipeItemView item = sender as SwipeItemView;
menuitem model = item.BindingContext as menuitem;
}
}
public class menuitem
{
public string title { get; set; }
}
正如 Jason 所说,我们也建议您可以使用 ListView 上下文菜单来做,不需要使用 SwipView。选择一项并长按以获取上下文菜单,如下图所示。
<ListView ItemsSource="{Binding items}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Clicked="OnMore" Text="More" />
<MenuItem Clicked="OnDelete" Text="Delete" />
</ViewCell.ContextActions>
<StackLayout>
<Label Text="{Binding title}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
private void OnMore(object sender,EventArgs e)
{
MenuItem item = sender as MenuItem;
menuitem model = item.BindingContext as menuitem;
}
关于ListView交互,请看:
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/interactivity
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。