Xml-Speicherung fertig gestellt
This commit is contained in:
parent
cc28b87b9f
commit
2b2f31371a
5 changed files with 58 additions and 38 deletions
|
@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
|
||||||
namespace TimeScheduler.Common
|
namespace TimeScheduler.Common
|
||||||
{
|
{
|
||||||
/// <summary>Basis-Klasse für Objekte, die sich der Oberfläche mitteilen möchten</summary>
|
/// <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>
|
/// <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>
|
/// <typeparam name="T">Typ des Feldes</typeparam>
|
||||||
|
|
|
@ -4,13 +4,15 @@ using System.IO;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
using System.Xml.Serialization;
|
using System.Xml.Serialization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
|
||||||
namespace TimeScheduler.Model.Impl
|
namespace TimeScheduler.Model.Impl
|
||||||
{
|
{
|
||||||
class FileDomain : IDomain
|
class FileDomain : IDomain
|
||||||
{
|
{
|
||||||
#region Konstruktion
|
#region Konstruktion
|
||||||
private List<ITimeItem> allItems_ = new List<ITimeItem>();
|
private List<TimeItem> allItems_ = new List<TimeItem>();
|
||||||
private string filename_ = string.Empty;
|
private string filename_ = string.Empty;
|
||||||
|
|
||||||
public FileDomain()
|
public FileDomain()
|
||||||
|
@ -19,11 +21,11 @@ namespace TimeScheduler.Model.Impl
|
||||||
filename_ = Path.Combine(fi.DirectoryName, fi.Name + ".xmldata");
|
filename_ = Path.Combine(fi.DirectoryName, fi.Name + ".xmldata");
|
||||||
|
|
||||||
if (File.Exists(filename_))
|
if (File.Exists(filename_))
|
||||||
ReadList(filename_);
|
Load();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Wenn nichts vorhanden, dann einen Spielsatz anlegen
|
// 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 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 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 },
|
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
|
#region Hilfsfunktionen
|
||||||
private void ReadList(string filePath)
|
private void ReadList(string filePath)
|
||||||
{
|
{
|
||||||
var xs = new XmlSerializer(typeof(List<ITimeItem>));
|
|
||||||
var bin = new BinaryFormatter();
|
var bin = new BinaryFormatter();
|
||||||
using (var rd = new StreamReader(filePath))
|
using (var rd = new FileStream(filePath, FileMode.Open))
|
||||||
{
|
allItems_ = bin.Deserialize(rd) as List<TimeItem>;
|
||||||
var elems = xs.Deserialize(rd) as List<ITimeItem>;
|
|
||||||
allItems_ = elems;
|
|
||||||
//allItems.Clear();
|
|
||||||
//foreach (var elem in elems)
|
|
||||||
// allItems.Add(elem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WriteList(string path)
|
private void WriteList(string path)
|
||||||
{
|
{
|
||||||
XmlSerializer xs = new XmlSerializer(typeof(List<TimeItem>));
|
|
||||||
var bin = new BinaryFormatter();
|
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))
|
using (StreamWriter wr = new StreamWriter(path))
|
||||||
{
|
xs.Serialize(wr, allItems_);
|
||||||
xs.Serialize(wr, (List<ITimeItem>)allItems_);
|
}
|
||||||
}
|
|
||||||
|
private void Load()
|
||||||
|
{
|
||||||
|
ReadListXml(filename_);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Save()
|
private void Save()
|
||||||
{
|
{
|
||||||
var newFilename = filename_ + ".new";
|
var newFilename = filename_ + ".new";
|
||||||
WriteList(newFilename);
|
WriteListXml(newFilename);
|
||||||
File.Delete(filename_);
|
File.Delete(filename_);
|
||||||
File.Move(newFilename, filename_);
|
File.Move(newFilename, filename_);
|
||||||
}
|
}
|
||||||
|
@ -72,7 +82,7 @@ namespace TimeScheduler.Model.Impl
|
||||||
public List<ITimeItem> GetItems(DateTime date)
|
public List<ITimeItem> GetItems(DateTime date)
|
||||||
{
|
{
|
||||||
var founded = allItems_.Where(x => x.From.Date == date);
|
var founded = allItems_.Where(x => x.From.Date == date);
|
||||||
return founded.ToList();
|
return founded.Cast<ITimeItem>().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<int, string> GetCostUnits()
|
public Dictionary<int, string> GetCostUnits()
|
||||||
|
@ -91,18 +101,18 @@ namespace TimeScheduler.Model.Impl
|
||||||
|
|
||||||
public void ElementAdded(ITimeItem timeItem)
|
public void ElementAdded(ITimeItem timeItem)
|
||||||
{
|
{
|
||||||
allItems_.Add(timeItem);
|
allItems_.Add((TimeItem)timeItem);
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
public void ElementChanged(ITimeItem timeItem)
|
public void ElementChanged(ITimeItem timeItem)
|
||||||
{
|
{
|
||||||
allItems_.Remove(timeItem);
|
allItems_.Remove((TimeItem)timeItem);
|
||||||
allItems_.Add(timeItem);
|
allItems_.Add((TimeItem)timeItem);
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
public void ElementRemoved(ITimeItem timeItem)
|
public void ElementRemoved(ITimeItem timeItem)
|
||||||
{
|
{
|
||||||
allItems_.Remove(timeItem);
|
allItems_.Remove((TimeItem)timeItem);
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -1,10 +1,33 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
using TimeScheduler.Common;
|
using TimeScheduler.Common;
|
||||||
|
|
||||||
namespace TimeScheduler.Model.Impl
|
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_;
|
private string description_;
|
||||||
public string Description { get { return description_; } set { SetField(ref description_, value); } }
|
public string Description { get { return description_; } set { SetField(ref description_, value); } }
|
||||||
|
|
||||||
|
@ -19,5 +42,6 @@ namespace TimeScheduler.Model.Impl
|
||||||
|
|
||||||
private TimeItemType itemType_;
|
private TimeItemType itemType_;
|
||||||
public TimeItemType ItemType { get { return itemType_; } set { SetField(ref itemType_, value); } }
|
public TimeItemType ItemType { get { return itemType_; } set { SetField(ref itemType_, value); } }
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -61,7 +61,6 @@
|
||||||
<Compile Include="Domain\Impl\FileDomain.cs" />
|
<Compile Include="Domain\Impl\FileDomain.cs" />
|
||||||
<Compile Include="Domain\Impl\TimeItem.cs" />
|
<Compile Include="Domain\Impl\TimeItem.cs" />
|
||||||
<Compile Include="Domain\TimeItemType.cs" />
|
<Compile Include="Domain\TimeItemType.cs" />
|
||||||
<Compile Include="Model\ATimeItem.cs" />
|
|
||||||
<Compile Include="Model\ITimeItem.cs" />
|
<Compile Include="Model\ITimeItem.cs" />
|
||||||
<Compile Include="ViewModel\MainViewModel.cs" />
|
<Compile Include="ViewModel\MainViewModel.cs" />
|
||||||
<Page Include="MainWindow.xaml">
|
<Page Include="MainWindow.xaml">
|
||||||
|
|
Loading…
Reference in a new issue