微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CollectionView 中的对象绑定与 SwipeItem 无法正常工作

如何解决CollectionView 中的对象绑定与 SwipeItem 无法正常工作

在我的 ContentPage XAML 文件中,我有一个像这样的 CollectionView 设置:

<ScrollView Grid.Row="1" Padding="0,0" BackgroundColor="LightGray"  IsVisible="{ Binding ShowTrip }"  >

        <CollectionView x:Name="collectionView" 
                        ItemsSource="{Binding Items}"
                        SelectionMode="Single">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <swipeview>
                        <swipeview.RightItems>
                            <SwipeItems>
                                <SwipeItem Text="Directions"
                                           IconImageSource="icon_directions.png"
                                           BackgroundColor="White"
                                           Command="{Binding Source={x:Reference myContentPage},Path=BindingContext.DirectionsCommand}"
                                                           CommandParameter="{Binding}"/>
                                 <SwipeItem Text="Deliver"
                                            IconImageSource="icon_deliver.png"
                                            BackgroundColor="White"
                                            Command="{Binding Source={x:Reference myContentPage},Path=BindingContext.DeliverCommand}"
                                            CommandParameter="{Binding}"/>
                           </SwipeItems>
                       </swipeview.RightItems>
                       <Frame BackgroundColor="White" CornerRadius="0" Margin="0,5,0" HasShadow="True">    
                           <Grid x:DataType="model:sRemesa" Padding="0">
                               <Grid.RowDeFinitions>
                                   <RowDeFinition Height="Auto" />
                                   <RowDeFinition Height="Auto" />
                                   <RowDeFinition Height="Auto" />
                                   <RowDeFinition Height="Auto" />
                                   <RowDeFinition Height="Auto" />
                                   <RowDeFinition Height="Auto" />
                               </Grid.RowDeFinitions>
                               <Label Text="Remittance" LineBreakMode="Nowrap" FontAttributes="Bold" 
                                      Style="{DynamicResource ListItemTextStyle}" 
                                      FontSize="13" Grid.Column="0" Grid.Row="1" /> <Label Text="{Binding Number}" LineBreakMode="Nowrap" 
                                                            Style="{DynamicResource ListItemTextStyle}" 
                                                            FontSize="13" Grid.Column="1" Grid.Row="1" />
                                                    <Label Text="{Binding Customer}" 
                                                            Grid.Row="2"
                                                            LineBreakMode="Nowrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.ColumnSpan="4" />
                                                    <Label Text="{Binding Address }" 
                                                            Grid.Row="3"
                                                            LineBreakMode="Nowrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.ColumnSpan="4" />
                                                    <Label Text="Boxes"  FontAttributes="Bold" 
                                                            Grid.Row="4" Grid.Column="0"
                                                            LineBreakMode="Nowrap" 
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" />
                                                    <Label Text="{Binding BoxesQty}" 
                                                            Grid.Row="4" 
                                                            LineBreakMode="Nowrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.Column="1" />
                                                    <Label Text="Weight"  FontAttributes="Bold" 
                                                            Grid.Row="4"
                                                            LineBreakMode="Nowrap" 
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.Column="2" />
                                                    <Label Text="{Binding TotalWeight }" 
                                                            Grid.Row="4" 
                                                            LineBreakMode="Nowrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.Column="3" />
                                                </Grid>
                                            </Frame>
                                        </swipeview>

                                    </DataTemplate>
                                </CollectionView.ItemTemplate>
                            </CollectionView>
                </ScrollView>

Items 是一个 ObservableCollection。问题在 SwipeItems 中根深蒂固,Commands 执行得很好,但 CommandParameter 有时会为 null,有时会得到预期的绑定 TItem 对象。在 CommandParameter 属性上使用 {Binding .} 时的行为是相同的。

调试时,当返回空值时,我从 {Binding .} 转到 {Binding} 或反之亦然,它开始按预期工作。

命令在 viewmodel 上声明如下:

public ICommand DeliverCommand => new Command<TItem>(DeliverRemittance);
public ICommand DirectionsCommand => new Command<TItem>(DirectionsToDestination);

private async void DirectionsToDestination(TItem item)
{
   //....
}
private async void DeliverRemittance(TItem item)
{
   //....
}

viewmodel 被实例化并分配给 ContentPages 构造函数上的 BindingContext。

解决方法

ContentPage 的 XAML 标记定义如下:

<ContentPage.Content>
    <RefreshView>
        <Grid>
           <StackLayout>
               <ContentView>...</ContentView>
               <StackLayout>...</StackLayout> 
           </StackLayout> 
           <ScrollView>
               <CollectionView>...</CollectionView>
           </ScrollView>
        </Grid>
    </RefreshView>
</ContentPage.Content>

从@Cfun 推荐开始:

旁注,您不需要将 collectionView 包装在 ScrollView 中,它自己处理滚动功能。

所以我开始清理 ContentPage 的标记,删除不必要的布局控件,然后,里面的 CollectionView 和 SwipeView 开始工作得很好。标记最终是这样的:

<ContentPage.Content>
        <StackLayout>
            <ContentView>
             .
             .
             .
            </ContentView>
            <CollectionView>
             .
             .
             .
            </CollectionView>
        </StackLayout> 
</ContentPage.Content>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?