孤立存储行为怪异

本文关键字:存储 | 更新日期: 2023-09-27 18:15:52

在我的windows phone 7应用程序中有一个名为addFavorites的页面。它在页面底部显示一个带有复选框和按钮的人员列表。

在复选框的选中和未选中的事件上,我只是在List中添加和删除相应的对象。

在单击Add Button时,我将填充列表添加到隔离存储。

下面是我的代码
public partial class AddFavourites : PhoneApplicationPage
{
    public int checkedPlayers;
    public List<MarathonPlayer> selectedPlayers = null;
    public AddFavourites()
    {
        InitializeComponent();
        if (IsolatedStorageSettings.ApplicationSettings.Contains("FavouritePlayers"))
        {
            selectedPlayers = (List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]);
        }
        else
        {
            selectedPlayers = new List<MarathonPlayer>();
        }
        listOfPlayers.ItemsSource = ManageFavourites.listSearch;
    }
    private void checkBox_Checked(object sender, RoutedEventArgs e)
    {
        MarathonPlayer mp = (sender as CheckBox).DataContext as MarathonPlayer;
        if (!IsolatedStorageSettings.ApplicationSettings.Contains("FavouritePlayers"))
        {
            selectedPlayers.Add(mp);
        }
        else
        {
            Boolean PlayerIsSelected = false;
            selectedPlayers = null;
            selectedPlayers = (List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]);
            for (int j = 0; j < selectedPlayers.Count(); j++)
            {
                PlayerIsSelected = false;
                if (selectedPlayers[j].playerBibNum.Equals(mp.playerBibNum))
                {
                    CheckBox cb = sender as CheckBox;
                    cb.IsChecked = false;
                    PlayerIsSelected = false;
                    MessageBox.Show("The runner is already added to your favourites");
                    break;
                }
                else if (selectedPlayers.Count == 5)
                {
                    CheckBox cb = sender as CheckBox;
                    cb.IsChecked = false;
                    PlayerIsSelected = false;
                    MessageBox.Show("You cannot add more than 5 runners in your favourites");
                    break;
                }
                PlayerIsSelected = true;
            }
            if (PlayerIsSelected)
            {
                selectedPlayers.Add(mp);
            }
        }
    }
    private void checkBox_Unchecked(object sender, RoutedEventArgs e)
    {
        MarathonPlayer mp = (sender as CheckBox).DataContext as MarathonPlayer;
        selectedPlayers.Remove(mp);
    }
    private void addFav_Click_1(object sender, RoutedEventArgs e)
    {
        if (IsolatedStorageSettings.ApplicationSettings.Contains("FavouritePlayers"))
        {
            IsolatedStorageSettings.ApplicationSettings.Remove("FavouritePlayers");
        }
        IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"] = selectedPlayers;
        IsolatedStorageSettings.ApplicationSettings.Save();
        this.NavigationService.Navigate(new Uri("/Race Events/Favourites/ManageFavourites.xaml", UriKind.Relative));
    }
}

问题:

当我加载应用程序时,我选中了一个复选框并按下返回按钮,它表现得很好。

然后我选择一个项目,点击添加按钮,数据根据需要添加到隔离存储。

在隔离存储中再次添加一个项目后,我选中了一个复选框并单击后退按钮,这次选中的项目被添加到隔离存储中,而没有按后退按钮,这意味着,现在我在隔离存储中找到了2个项目。

,每次我只是选中一个复选框,按下后退按钮,项目被添加到隔离存储,而不按下添加按钮。

我想知道发生了什么事,但是找不到。

急事请帮忙

Thanks and regards

编辑我发现更多的是,如果选中复选框,而不是取消选中它,没有这样的问题,所以我认为按下后退按钮后,一切都被发送到隔离存储。

孤立存储行为怪异

正如@abhinav所提到的,您正在使用对存储在隔离存储中的列表的引用。因此,对列表所做的任何更改都会反射回隔离存储。

你可以复制这个列表:

selectedPlayers = new List<MarathonPlayer>((List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]));
 selectedPlayers = (List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]);

selectedPlayers是对IsolatedStorageSettings Dictionary元素的引用。所以所有的变化都是直接对你的IsolatedStorageSettings

尝试使用

IsolatedStorageSettings mysettings = IsolatedStorageSettings.ApplicationSettings;