Windows Phone - 从ListPicker中删除项目并以完整模式刷新数据源

时间:2014-09-15 07:14:14

标签: c# windows-phone-8 listpicker

我有一个ListPicker,其items源是一个可观察的集合。我在此列表中添加了一个上下文菜单,以便用户可以长按任何项目来编辑/删除它。我有两个关于删除的问题:

1-如果我从可观察集合中删除任何项目,则更改不会反映在完整模式中,我必须关闭选择器并重新打开,然后,我可以看到该项目已被删除

2-如果要删除的项目是最后一项,则删除它将触发异常:System.InvalidOperationException: SelectedItem must always be set to a valid value

这是我的xaml的一部分:

<toolkit:ListPicker Header="Shipping Addresses" Name="lst_ShippingAddresses" ExpansionMode="FullScreenOnly">
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding AddressCaption}" Margin="0,10" FontSize="26"/>
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu>
                        <toolkit:MenuItem Header="Edit" Click="EditShippingAddress"/>
                        <toolkit:MenuItem Header="Delete" Click="DeleteShippingAddress"/>
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
            </StackPanel>
        </DataTemplate>
</toolkit:ListPicker>

这是删除功能:

private void DeleteShippingAddress(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(() =>
    {
        MenuItem item = sender as MenuItem;
        ShippingAddress address = item.DataContext as ShippingAddress;

        if (lst_DeliveryAddresses.SelectedItem == address)
        {
            if (lst_DeliveryAddresses.Items.Count == 1) // last element in list
            {
                shippingAddresses.Clear();
            }
            else
            {
                if (lst_DeliveryAddresses.SelectedIndex == 0) // first element
                    lst_DeliveryAddresses.SelectedIndex = lst_DeliveryAddresses.SelectedIndex + 1;
                else
                    lst_DeliveryAddresses.SelectedIndex = lst_DeliveryAddresses.SelectedIndex - 1;
                shippingAddresses.Remove(address);

            }
        }
        else
        {
            shippingAddresses.Remove(address);
        }
    });
}

如何在完整模式下刷新数据源?我试过lst_DeliveryAddresses.UpdateLayout()但没有用。 如何在不获取此异常的情况下清除ListPicker的数据源?

请帮助,谢谢!

0 个答案:

没有答案