Xml-Speicherung fertig gestellt

This commit is contained in:
mdn 2015-12-05 13:30:47 +01:00
parent cc28b87b9f
commit 2b2f31371a
5 changed files with 58 additions and 38 deletions

View file

@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
namespace TimeScheduler.Common
{
/// <summary>Basis-Klasse für Objekte, die sich der Oberfläche mitteilen möchten</summary>
abstract class NotifyableObject : INotifyPropertyChanged
public abstract class NotifyableObject : INotifyPropertyChanged
{
/// <summary>Setzt den neuen Wert auf das Feld, wenn sie unterschiedlich sind und wird das <see cref="PropertyChanged"/>-Ereignis</summary>
/// <typeparam name="T">Typ des Feldes</typeparam>

View file

@ -4,13 +4,15 @@ using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Linq;
using System.Reflection;
namespace TimeScheduler.Model.Impl
{
class FileDomain : IDomain
{
#region Konstruktion
private List<ITimeItem> allItems_ = new List<ITimeItem>();
private List<TimeItem> allItems_ = new List<TimeItem>();
private string filename_ = string.Empty;
public FileDomain()
@ -19,11 +21,11 @@ namespace TimeScheduler.Model.Impl
filename_ = Path.Combine(fi.DirectoryName, fi.Name + ".xmldata");
if (File.Exists(filename_))
ReadList(filename_);
Load();
else
{
// Wenn nichts vorhanden, dann einen Spielsatz anlegen
allItems_ = new List<ITimeItem> {
allItems_ = new List<TimeItem> {
new TimeItem { Description = "Desc 01", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 14, ItemType = TimeItemType.Normal },
new TimeItem { Description = "Desc 02", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 13, ItemType = TimeItemType.Break },
new TimeItem { Description = "Desc 03", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 12, ItemType = TimeItemType.Holiday },
@ -37,32 +39,40 @@ namespace TimeScheduler.Model.Impl
#region Hilfsfunktionen
private void ReadList(string filePath)
{
var xs = new XmlSerializer(typeof(List<ITimeItem>));
var bin = new BinaryFormatter();
using (var rd = new StreamReader(filePath))
{
var elems = xs.Deserialize(rd) as List<ITimeItem>;
allItems_ = elems;
//allItems.Clear();
//foreach (var elem in elems)
// allItems.Add(elem);
}
using (var rd = new FileStream(filePath, FileMode.Open))
allItems_ = bin.Deserialize(rd) as List<TimeItem>;
}
private void WriteList(string path)
{
XmlSerializer xs = new XmlSerializer(typeof(List<TimeItem>));
var bin = new BinaryFormatter();
using (var wr = new FileStream(path, FileMode.OpenOrCreate))
bin.Serialize(wr, allItems_);
}
private void ReadListXml(string filePath)
{
var xs = new XmlSerializer(typeof(List<TimeItem>));
using (var rd = new StreamReader(filePath))
allItems_ = xs.Deserialize(rd) as List<TimeItem>;
}
private void WriteListXml(string path)
{
var xs = new XmlSerializer(typeof(List<TimeItem>));
using (StreamWriter wr = new StreamWriter(path))
{
xs.Serialize(wr, (List<ITimeItem>)allItems_);
}
xs.Serialize(wr, allItems_);
}
private void Load()
{
ReadListXml(filename_);
}
private void Save()
{
var newFilename = filename_ + ".new";
WriteList(newFilename);
WriteListXml(newFilename);
File.Delete(filename_);
File.Move(newFilename, filename_);
}
@ -72,7 +82,7 @@ namespace TimeScheduler.Model.Impl
public List<ITimeItem> GetItems(DateTime date)
{
var founded = allItems_.Where(x => x.From.Date == date);
return founded.ToList();
return founded.Cast<ITimeItem>().ToList();
}
public Dictionary<int, string> GetCostUnits()
@ -91,18 +101,18 @@ namespace TimeScheduler.Model.Impl
public void ElementAdded(ITimeItem timeItem)
{
allItems_.Add(timeItem);
allItems_.Add((TimeItem)timeItem);
Save();
}
public void ElementChanged(ITimeItem timeItem)
{
allItems_.Remove(timeItem);
allItems_.Add(timeItem);
allItems_.Remove((TimeItem)timeItem);
allItems_.Add((TimeItem)timeItem);
Save();
}
public void ElementRemoved(ITimeItem timeItem)
{
allItems_.Remove(timeItem);
allItems_.Remove((TimeItem)timeItem);
Save();
}
#endregion

View file

@ -1,10 +1,33 @@
using System;
using System.Runtime.Serialization;
using TimeScheduler.Common;
namespace TimeScheduler.Model.Impl
{
public class TimeItem : NotifyableObject, ITimeItem
/// <summary>
///
/// </summary>
/// <remarks>
/// <see cref="ISerializable"/> muss implementiert werden, damit die Daten über den BinarFormater serialisiert werden können.
/// Für den XmlSerializer müsste die Klasse auf Public gestellt werden, was nicht immer gewünscht ist
/// </remarks>
[Serializable]
public class TimeItem : NotifyableObject, ITimeItem//, ISerializable
{
public TimeItem() { }
//#region ISerializable
//public TimeItem(SerializationInfo info, StreamingContext context)
//{
// Description = (string)info.GetValue("Description", typeof(string));
//}
//public void GetObjectData(SerializationInfo info, StreamingContext context)
//{
// info.AddValue("Description", Description, typeof(string));
//}
//#endregion
#region ITimeItem
private string description_;
public string Description { get { return description_; } set { SetField(ref description_, value); } }
@ -19,5 +42,6 @@ namespace TimeScheduler.Model.Impl
private TimeItemType itemType_;
public TimeItemType ItemType { get { return itemType_; } set { SetField(ref itemType_, value); } }
#endregion
}
}

View file

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TimeScheduler.Common;
namespace TimeScheduler.Model
{
abstract class ATimeItem : NotifyableObject, ITimeItem
{
}
}

View file

@ -61,7 +61,6 @@
<Compile Include="Domain\Impl\FileDomain.cs" />
<Compile Include="Domain\Impl\TimeItem.cs" />
<Compile Include="Domain\TimeItemType.cs" />
<Compile Include="Model\ATimeItem.cs" />
<Compile Include="Model\ITimeItem.cs" />
<Compile Include="ViewModel\MainViewModel.cs" />
<Page Include="MainWindow.xaml">