代码之家  ›  专栏  ›  技术社区  ›  Rachel

在ViewModel中更改属性使模型不可变量化?

  •  0
  • Rachel  · 技术社区  · 14 年前

    我有一个物体可以追踪和某人联系的最佳时间。它可以设置为Anyday、Weekdays、Evenings、specific days和Anytime、morning、午后、晚上和specific times。保存对象后,它将被序列化并发送到WCF服务器。

    从本质上讲,对象是7天的集合。每天包含一个int表示一周中的某一天,一个timespan集合定义该天的正常通话时间,一个boolean标志集合定义选择了哪些“快捷方式”时间组(上午、下午、晚上等)。

    我正在使用MVVM,并且有一个VM来处理这个类。除了天数集合之外,VM包含的唯一属性是一个int值,其中定义了工作日的“快捷方式”组(工作日、周末等)。

    在我将工作日的“快捷方式”组设置为“SpecificDays”之前,一切都非常顺利。保存时,尝试将对象传递到WCF服务器时出错。该错误表示它无法序列化具有如下所示内部异常的参数(请记住,WCF错误是非常通用的,通常根本不指向问题)。以下是我尝试做的截图:

    Sample Image

    这对我来说没有意义,因为ShortcutWeekday根本没有发送到WCF服务器。唯一要做的就是收集天数。另一件令人费解的事情是,单击“特定日期”单选按钮,然后单击返回到另一个选择,WCF调用也会失败。另外,如果问题出在我的类本身,它不会在任何时候都无法保存,而不仅仅是在特定的日子??我使用上面的示例仔细检查了Days集合的属性值,并且对象属性设置完全相同。

    内部异常:

    "Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 
    'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System' 
    is not expected. Consider using a DataContractResolver or add any types not known 
    statically to the list of known types - for example, by using the KnownTypeAttribute 
    attribute or by adding them to the list of known types passed to DataContractSerializer."
    

    // Used to track which Radio Button is selected
    private int _selectedWeekdayGroup = 0;
    
    // Object holding the current BestContactTime
    private BestContactTime _bestContactTime;
    
    // Shortcut to multiple Days in BestContactTime
    public int SelectedWeekdayGroup
    {
        get { return _selectedWeekdayGroup; }
        set
        {
            //UpdateCallableDays(value); // This updates the BestContactTime.Days collection
            _selectedWeekdayGroup = value;
            //OnPropertyChanged("SelectedTimesGroups"); // This property is just which set of ShortcutTimes are displayed in checkboxes 
        }
    }
    

    最佳接触时间:

    // Should always have only 7 objects, one per day of week
    public ObservableCollection<ContactDay> Days;
    

    联系日期:

    public int WeekDay;
    public SortableObservableCollection<TimeSpan> CallableTimes;
    public SortableObservableCollection<bool> CallableTimeGroups;
    

    SortableObservaleCollection只是从ObservaleCollection继承的一个类,它带有一些附加的方法,如Sorting和AddRange。

    2 回复  |  直到 14 年前
        1
  •  2
  •   SLaks    14 年前

    设置属性似乎会导致添加事件处理程序。
    尝试添加 [field: NonSerialized] 参加活动。

        2
  •  2
  •   Tim Cooper    13 年前

    你可以用我的 sertool 为了验证这一点,我怀疑这只是一个不可序列化的附加到模型中事件的情况,因此序列化失败。

    您可以通过以下方式修复:

    [field:NonSerialized]
    

    对违规事件。