C# 行为怪异的隔离存储

C# 行为怪异的隔离存储,c#,silverlight,windows-phone-7,windows-phone-7.1,isolatedstorage,C#,Silverlight,Windows Phone 7,Windows Phone 7.1,Isolatedstorage,我在WindowsPhone7应用程序中有一个名为addFavorites的页面。 它在页面底部显示一个带有复选框和按钮的人员列表 在复选框的选中和未选中事件上,我只是添加和删除列表中相应的对象 单击Add按钮,我将填充的列表添加到独立存储中 selectedPlayers = (List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]); 下面是我的代码 publi

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

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

单击Add按钮,我将填充的列表添加到独立存储中

 selectedPlayers = (List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]);
下面是我的代码

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));
    }

}
public分部类addFavorites:PhoneApplicationPage
{
公共整数校验玩家;
公共列表selectedPlayers=null;
公众最喜爱的事物()
{
初始化组件();
if(IsolatedStorageSettings.ApplicationSettings.Contains(“FavoritePlayer”))
{
selectedPlayers=(列表)(隔离存储设置。应用程序设置[“收藏夹玩家]);
}
其他的
{
selectedPlayers=新列表();
}
listOfPlayers.ItemsSource=manageFavorites.listSearch;
}
已选中私有无效复选框(对象发送方、路由目标方)
{
MarathonLayer mp=(发件人作为复选框)。DataContext作为MarathonLayer;
如果(!IsolatedStorageSettings.ApplicationSettings.Contains(“FavoritePlayer”))
{
选择玩家。添加(mp);
}
其他的
{
布尔playerselected=false;
selectedPlayers=null;
selectedPlayers=(列表)(隔离存储设置。应用程序设置[“收藏夹玩家]);
对于(int j=0;j
问题:

当我加载应用程序时,我选中了一个复选框并按下了“后退”按钮,它表现良好

然后我选择了一个项目,点击add按钮,数据会根据需要添加到独立的存储中

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

 selectedPlayers = (List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]);
每次我只要勾选一个复选框并按下后退按钮,项目就会被添加到独立的存储中,而无需按下添加按钮

我试图弄清楚发生了什么事,但没能弄清楚

请帮我处理一下紧急情况

谢谢和问候

编辑 我发现更多的是,如果选中该复选框,而不是取消选中,则不会出现此类问题,因此我认为在按下“后退”按钮后,所有内容都将发送到独立存储

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

希望这有帮助。

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

您可以制作列表的副本:

selectedPlayers = new List<MarathonPlayer>((List<MarathonPlayer>)(IsolatedStorageSettings.ApplicationSettings["FavouritePlayers"]));
selectedPlayers=新列表((列表)(隔离存储设置。应用程序设置[“收藏夹玩家]));

i添加了公共静态隔离存储设置mysettings=IsolatedStorageSettings.ApplicationSettings;在我的App.cs中,但没有用我不明白的一件事是,它第一次工作得很好。基本上,你的
addFav\u单击1
变得不必要了。因为,每次更改
选择播放器
,应用程序设置
键的值也会更改。另外,您所说的
App.cs
是指
App.xaml.cs
,或者上述代码在不同的
App.cs
中。是指其App.xaml.cs。但问题是,只有在隔离存储中至少添加了一个密钥时,它才会这样做。