|
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace TaskList.DataModel
{
[Serializable]
public sealed class TaskCollection : ObservableCollection<Task>, ISerializable
{
[NonSerialized]
private bool isDirty;
public TaskCollection()
{
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily")]
private TaskCollection(SerializationInfo info, StreamingContext context)
{
int count = info.GetInt32("Count");
for (int i = 0; i < count; ++i)
{
Task task = (Task)info.GetValue(string.Format(CultureInfo.InvariantCulture, "Item{0}", i), typeof(Task));
Add(task);
}
isDirty = false;
}
public bool IsDirty
{
get { return isDirty; }
set
{
if (isDirty != value)
{
isDirty = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsDirty"));
}
}
}
public static TaskCollection Load(string fileName)
{
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
return binaryFormatter.Deserialize(stream) as TaskCollection;
}
}
public void Save(string fileName)
{
using (FileStream stream = new FileStream(fileName, FileMode.Create))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(stream, this);
}
}
protected override void InsertItem(int index, Task item)
{
base.InsertItem(index, item);
AddChangeListener(item);
IsDirty = true;
}
protected override void RemoveItem(int index)
{
Task item = this[index];
base.RemoveItem(index);
RemoveChangeListener(item);
IsDirty = true;
}
protected override void ClearItems()
{
if (Count > 0)
{
foreach (Task item in this)
RemoveChangeListener(item);
base.ClearItems();
IsDirty = true;
}
}
protected override void SetItem(int index, Task item)
{
if (this[index] != item)
{
RemoveChangeListener(this[index]);
base.SetItem(index, item);
AddChangeListener(item);
IsDirty = true;
}
}
protected override void MoveItem(int oldIndex, int newIndex)
{
base.MoveItem(oldIndex, newIndex);
IsDirty = true;
}
private void AddChangeListener(Task item)
{
if (item != null)
item.PropertyChanged += item_PropertyChanged;
}
private void RemoveChangeListener(Task item)
{
if (item != null)
item.PropertyChanged -= item_PropertyChanged;
}
private void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsDirty = true;
}
#region ISerializable Members
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Count", Count);
for (int i = 0; i < Count; ++i)
{
info.AddValue(string.Format(CultureInfo.InvariantCulture, "Item{0}", i), this[i]);
}
}
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Windows developer with 10+ years experience working in the banking industry.