Windows phone 7 我如何在caliburn.micro中删除子VM

Windows phone 7 我如何在caliburn.micro中删除子VM,windows-phone-7,caliburn.micro,tombstoning,Windows Phone 7,Caliburn.micro,Tombstoning,我在Caliburn.Micro中遇到了一些墓碑问题。我有一个pivot控件,其中每个pivot控件项中都有一个列表框。我只是想使用caliburn.micro的内置支持保存列表 我有一个MainViewModel,它将在一个pilot控件中初始化一系列子VM public class MainViewModel : Conductor<IScreen>.Collection.OneActive { private readonly Func<QiushiListVie

我在Caliburn.Micro中遇到了一些墓碑问题。我有一个pivot控件,其中每个pivot控件项中都有一个列表框。我只是想使用caliburn.micro的内置支持保存列表

我有一个MainViewModel,它将在一个pilot控件中初始化一系列子VM

public class MainViewModel : Conductor<IScreen>.Collection.OneActive
{
    private readonly Func<QiushiListViewModel> _createQiushiListViewModel;
    private readonly INavigationService _navigationService;
    private readonly IEventAggregator _events;
    readonly IWindowManager _windowManager;
    readonly Func<AboutUsViewModel> _aboutUsViewModelFactory;
    readonly Func<SettingsViewModel> _settingsViewModelFactory;

    public MainViewModel(Func<QiushiListViewModel> createQiushiListViewModel, 
                        INavigationService navigationService,
                        IEventAggregator events,
                        IWindowManager windowManager, 
                        Func<AboutUsViewModel> aboutUsViewModelFactory,
                        Func<SettingsViewModel> settingsViewModelFactory
                        )
    {
        _createQiushiListViewModel = createQiushiListViewModel;
        _navigationService = navigationService;
        _events = events;
        _windowManager = windowManager;
        _aboutUsViewModelFactory = aboutUsViewModelFactory;
        _settingsViewModelFactory = settingsViewModelFactory;
    }

    protected override void OnInitialize()
    {
        if(Items.Count==0)
        {
            Enumerable.Range(1, 5).Apply(x =>
            {
                var pivot = _createQiushiListViewModel();
                switch (x)
                {
                    case 1:
                        pivot.DisplayName = AppResources.App_Pivot_First;
                        pivot.Section = "late";
                        break;
                    case 2:
                        pivot.DisplayName = AppResources.App_Pivot_Second;
                        pivot.Section = "pic";
                        break;
                    case 3:
                        pivot.DisplayName = AppResources.App_Pivot_Third;
                        pivot.Section = "8hr";
                        break;
                    case 4:
                        pivot.DisplayName = AppResources.App_Pivot_Fourth;
                        pivot.Section = "week";
                        break;
                    case 5:
                        pivot.DisplayName = AppResources.App_Pivot_Fifth;
                        pivot.Section = "month";
                        break;
                    default:
                        break;
                }
                Items.Add(pivot);
            });
            ActivateItem(Items[0]);    
        }
        ...
    }

}
它不起作用,什么都没有发生,没有错误,没有例外。QiushiItem类是可序列化的,请参见以下代码段

[DataContract]
    public class QiushiItem : IComparable, IEqualityComparer<QiushiItem>
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Content { get; set; }
        [DataMember]
        public string ImageUrl { get; set; }
        [DataMember]
        public string MobileImageUrl { get; set; }
        [DataMember]
        public string Tags { get; set; }
        [DataMember]
        public int Tops { get; set; }
        [DataMember]
        public int Flops { get; set; }
        [DataMember]
        public int CommentsCount { get; set; }
        [DataMember]
        public DateTime PublishDateTime { get; set; }

        public string Age
        {
            get
            {
                if (DateTime.Now.Subtract(PublishDateTime).Minutes < 10)
                    return AppResources.App_TimeSpan_JustNow;
                if (DateTime.Now.Subtract(PublishDateTime).Minutes < 30)
                    return AppResources.App_TimeSpan_Recently;
                if (DateTime.Now.Subtract(PublishDateTime).Minutes < 60)
                    return AppResources.App_TimeSpan_Half_Hour_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Hours < 2)
                    return AppResources.App_TimeSpan_An_Hour_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Hours < 3)
                    return AppResources.App_TimeSpan_Two_Hours_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Hours < 24)
                    return AppResources.App_TimeSpan_In_One_Day;
                if (DateTime.Now.Subtract(PublishDateTime).Days < 2)
                    return AppResources.App_TimeSpan_One_Day_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Days < 3)
                    return AppResources.App_TimeSpan_Two_Days_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Days < 7)
                    return AppResources.App_TimeSpan_In_A_Week;
                return DateTime.Now.Subtract(PublishDateTime).Days < 30 ? AppResources.App_TimeSpan_In_A_Month : AppResources.App_TimeSpan_Long_Ago;
            }
        }

        int IComparable.CompareTo(object right)
        {
            if (!(right is QiushiItem)) throw new ArgumentException(AppResources.Ex_QiushiItem_Comparable_Argument_Exception, "right");
            QiushiItem righItem = (QiushiItem) right;
            return CompareTo(righItem);
        }

        public int CompareTo(QiushiItem right)
        {
            return Id.CompareTo(right.Id);
        }

        // Relational Operators.
        public static bool operator <(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) < 0;
        }
        public static bool operator <=(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) <= 0;
        }
        public static bool operator >(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) > 0;
        }
        public static bool operator >=(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) >= 0;
        }

        private static DateTimeComparer _datetimeComparer;
        public static IComparer DateTimeCompare
        {
            get
            {
                if (_datetimeComparer == null)
                    _datetimeComparer = new DateTimeComparer();
                return _datetimeComparer;
            }
        }

        private class DateTimeComparer : IComparer
        {
            #region IComparer Members
            int IComparer.Compare(object left, object right)
            {
                if (!(left is QiushiItem))
                    throw new ArgumentException(AppResources.Ex_QiushiItem_Comparable_Argument_Exception, "left");
                if (!(right is QiushiItem))
                    throw new ArgumentException(AppResources.Ex_QiushiItem_Comparable_Argument_Exception, "right");
                QiushiItem leftItem = (QiushiItem)left;
                QiushiItem rightItem = (QiushiItem)right;
                return leftItem.PublishDateTime.CompareTo(
                 rightItem.PublishDateTime);
            }
            #endregion

        }

        public bool Equals(QiushiItem x, QiushiItem y)
        {
            if (x.Id == y.Id)
                return true;
            return false;
        }

        public int GetHashCode(QiushiItem obj)
        {
            return obj.Id.GetHashCode();
        }
    }
[DataContract]
公共类求实项目:i可比较,i质量比较
{
[数据成员]
公共int Id{get;set;}
[数据成员]
公共字符串内容{get;set;}
[数据成员]
公共字符串ImageUrl{get;set;}
[数据成员]
公共字符串MobileImageUrl{get;set;}
[数据成员]
公共字符串标记{get;set;}
[数据成员]
公共整数{get;set;}
[数据成员]
公共整数触发器{get;set;}
[数据成员]
public int commentscont{get;set;}
[数据成员]
public DateTime PublishDateTime{get;set;}
公共字符串时代
{
得到
{
if(DateTime.Now.Subtract(PublishDateTime.Minutes<10)
返回AppResources.App\u TimeSpan\u JustNow;
if(DateTime.Now.Subtract(PublishDateTime.Minutes<30)
返回AppResources.App\u TimeSpan\u最近;
if(DateTime.Now.Subtract(PublishDateTime.Minutes<60)
返回AppResources.App\u TimeSpan\u半小时前;
if(DateTime.Now.Subtract(PublishDateTime.Hours<2)
返回AppResources.App\u TimeSpan\u一小时前;
if(DateTime.Now.Subtract(PublishDateTime.Hours<3)
返回AppResources.App\u TimeSpan\u两小时前;
if(DateTime.Now.Subtract(PublishDateTime.Hours<24)
在一天内返回AppResources.App\u TimeSpan\u;
if(DateTime.Now.Subtract(PublishDateTime.Days<2)
返回AppResources.App\u TimeSpan\u一天前;
if(DateTime.Now.Subtract(PublishDateTime.Days<3)
两天前返回AppResources.App\u TimeSpan\u;
if(DateTime.Now.Subtract(PublishDateTime.Days<7)
每周返回AppResources.App\u TimeSpan\u;
return DateTime.Now.Subtract(PublishDateTime).Days<30?AppResources.App\u TimeSpan\u月内:AppResources.App\u TimeSpan\u很久以前;
}
}
int IComparable.CompareTo(对象右侧)
{
如果(!(右边是QiushiItem))抛出新的ArgumentException(AppResources.Ex_QiushiItem_Compariable_Argument_Exception,“右边”);
求实项目righItem=(求实项目)右;
返回CompareTo(righItem);
}
公共国际比较(求是项目右侧)
{
返回Id.CompareTo(右.Id);
}
//关系运算符。
公共静态布尔运算符=(求实项目左,求实项目右)
{
返回左。比较(右)>=0;
}
专用静态DateTimeComparer\u DateTimeComparer;
公共静态iComparerDateTimeCompare
{
得到
{
if(_datetimeComparer==null)
_datetimeComparer=新的datetimeComparer();
返回日期时间比较器;
}
}
私有类DateTimeComparer:IComparer
{
#地区I比较成员
int IComparer.Compare(对象左、对象右)
{
如果(!(左为求是项))
抛出新的ArgumentException(AppResources.Ex_QiushiItem_Compariable_Arguments_Exception,“左”);
如果(!(右边是求是项目))
抛出新的ArgumentException(AppResources.Ex_QiushiItem_Compariable_Arguments_Exception,“右”);
求实项目左项=(求实项目)左项;
求实项目右项=(求实项目)右项;
返回leftItem.PublishDateTime.CompareTo(
rightItem.PublishDateTime);
}
#端区
}
公共布尔等于(求实项x,求实项y)
{
如果(x.Id==y.Id)
返回true;
返回false;
}
公共int GetHashCode(QiushiItem obj)
{
返回obj.Id.GetHashCode();
}
}
除此之外,我还尝试使用自定义序列化

public override void Configure()
        {
            Id(x=>x.Section);
            Property(x => x.QiushiItems).InAppSettings();
            Property(x => x.QiushiItems).InAppSettings().Configure(x =>
                                                                       {
                                                                           x.Save = SaveStrokes;
                                                                           x.Restore = RestoreStrokes;
                                                                       });
        }

        void SaveStrokes(QiushiListViewModel vm, Func<string> serialize, StorageMode nMode)
        {
            IsolatedStorageHelper.SaveObject(vm.Section, vm.QiushiItems);
        }

        void RestoreStrokes(QiushiListViewModel vm, Func<string> serialize, StorageMode nMode)
        {
            // use IsolatedStorageSettings.ApplicationSettings[vm.DisplayName + "ThePropertyKey"] 
            // to check if the key exists, and if it is there get the serialized data and deserialize
            if (vm.Section == null)
                return;
            if(IsolatedStorageSettings.ApplicationSettings[vm.Section]!=null) 
                IsolatedStorageHelper.GetObject<IEnumerable<QiushiItem>>(vm.Section);
        }
public override void Configure()
{
Id(x=>x.Section);
属性(x=>x.QiushiItems);
属性(x=>x.QiushiItems).InAppSettings().Configure(x=>
{
x、 Save=SaveStrokes;
x、 Restore=RestoreStrokes;
});
}
void SaveStrokes(qiushilitviewmodel vm、Func序列化、StorageMode nMode)
{
IsolatedStorageHelper.SaveObject(vm.Section、vm.QiushiItems);
}
void RestoreStrokes(qiushilitviewmodel vm、Func序列化、StorageMode nMode)
{
//使用隔离存储设置。应用程序设置[vm.DisplayName+“ThePropertyKey”]
//要检查密钥是否存在,以及它是否存在,请获取序列化数据并反序列化
if(vm.Section==null)
返回;
if(IsolatedStorageSettings.ApplicationSettings[vm.Section]!=null)
IsolatedStorageHelper.GetObject(vm.Section);
}
但是,问题是有5个QiushilistViewModel,在进行逻辑删除时,保存/恢复
[DataContract]
    public class QiushiItem : IComparable, IEqualityComparer<QiushiItem>
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Content { get; set; }
        [DataMember]
        public string ImageUrl { get; set; }
        [DataMember]
        public string MobileImageUrl { get; set; }
        [DataMember]
        public string Tags { get; set; }
        [DataMember]
        public int Tops { get; set; }
        [DataMember]
        public int Flops { get; set; }
        [DataMember]
        public int CommentsCount { get; set; }
        [DataMember]
        public DateTime PublishDateTime { get; set; }

        public string Age
        {
            get
            {
                if (DateTime.Now.Subtract(PublishDateTime).Minutes < 10)
                    return AppResources.App_TimeSpan_JustNow;
                if (DateTime.Now.Subtract(PublishDateTime).Minutes < 30)
                    return AppResources.App_TimeSpan_Recently;
                if (DateTime.Now.Subtract(PublishDateTime).Minutes < 60)
                    return AppResources.App_TimeSpan_Half_Hour_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Hours < 2)
                    return AppResources.App_TimeSpan_An_Hour_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Hours < 3)
                    return AppResources.App_TimeSpan_Two_Hours_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Hours < 24)
                    return AppResources.App_TimeSpan_In_One_Day;
                if (DateTime.Now.Subtract(PublishDateTime).Days < 2)
                    return AppResources.App_TimeSpan_One_Day_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Days < 3)
                    return AppResources.App_TimeSpan_Two_Days_Ago;
                if (DateTime.Now.Subtract(PublishDateTime).Days < 7)
                    return AppResources.App_TimeSpan_In_A_Week;
                return DateTime.Now.Subtract(PublishDateTime).Days < 30 ? AppResources.App_TimeSpan_In_A_Month : AppResources.App_TimeSpan_Long_Ago;
            }
        }

        int IComparable.CompareTo(object right)
        {
            if (!(right is QiushiItem)) throw new ArgumentException(AppResources.Ex_QiushiItem_Comparable_Argument_Exception, "right");
            QiushiItem righItem = (QiushiItem) right;
            return CompareTo(righItem);
        }

        public int CompareTo(QiushiItem right)
        {
            return Id.CompareTo(right.Id);
        }

        // Relational Operators.
        public static bool operator <(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) < 0;
        }
        public static bool operator <=(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) <= 0;
        }
        public static bool operator >(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) > 0;
        }
        public static bool operator >=(QiushiItem left, QiushiItem right)
        {
            return left.CompareTo(right) >= 0;
        }

        private static DateTimeComparer _datetimeComparer;
        public static IComparer DateTimeCompare
        {
            get
            {
                if (_datetimeComparer == null)
                    _datetimeComparer = new DateTimeComparer();
                return _datetimeComparer;
            }
        }

        private class DateTimeComparer : IComparer
        {
            #region IComparer Members
            int IComparer.Compare(object left, object right)
            {
                if (!(left is QiushiItem))
                    throw new ArgumentException(AppResources.Ex_QiushiItem_Comparable_Argument_Exception, "left");
                if (!(right is QiushiItem))
                    throw new ArgumentException(AppResources.Ex_QiushiItem_Comparable_Argument_Exception, "right");
                QiushiItem leftItem = (QiushiItem)left;
                QiushiItem rightItem = (QiushiItem)right;
                return leftItem.PublishDateTime.CompareTo(
                 rightItem.PublishDateTime);
            }
            #endregion

        }

        public bool Equals(QiushiItem x, QiushiItem y)
        {
            if (x.Id == y.Id)
                return true;
            return false;
        }

        public int GetHashCode(QiushiItem obj)
        {
            return obj.Id.GetHashCode();
        }
    }
public override void Configure()
        {
            Id(x=>x.Section);
            Property(x => x.QiushiItems).InAppSettings();
            Property(x => x.QiushiItems).InAppSettings().Configure(x =>
                                                                       {
                                                                           x.Save = SaveStrokes;
                                                                           x.Restore = RestoreStrokes;
                                                                       });
        }

        void SaveStrokes(QiushiListViewModel vm, Func<string> serialize, StorageMode nMode)
        {
            IsolatedStorageHelper.SaveObject(vm.Section, vm.QiushiItems);
        }

        void RestoreStrokes(QiushiListViewModel vm, Func<string> serialize, StorageMode nMode)
        {
            // use IsolatedStorageSettings.ApplicationSettings[vm.DisplayName + "ThePropertyKey"] 
            // to check if the key exists, and if it is there get the serialized data and deserialize
            if (vm.Section == null)
                return;
            if(IsolatedStorageSettings.ApplicationSettings[vm.Section]!=null) 
                IsolatedStorageHelper.GetObject<IEnumerable<QiushiItem>>(vm.Section);
        }