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
|
||||
{
|
||||
/// <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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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\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">
|
||||
|
|
Loading…
Reference in a new issue