Wire up the views.

This commit is contained in:
Daniel Kraus
2015-08-09 13:24:44 +02:00
parent 257e3e8568
commit b59c9f2898
21 changed files with 363 additions and 84 deletions

View File

@ -47,7 +47,7 @@ namespace zaaReloaded2.ViewModels
Elements = new ObservableCollection<ElementViewModel>();
if (controlElement != null)
{
foreach (FormatElementBase childElement in controlElement.FormatElements)
foreach (FormatElementBase childElement in controlElement.Children)
{
FormatElementViewModel childVM = new FormatElementViewModel(childElement);
Elements.Add(childVM);
@ -55,6 +55,22 @@ namespace zaaReloaded2.ViewModels
}
}
/// <summary>
/// Creates a new instance by copying the Elements property from another
/// ControlElementViewModel and the Children property from the other
/// view model's model.
/// </summary>
/// <param name="copyFrom">Other ControlElementViewModel to copy
/// from.</param>
public ControlElementViewModel(
ControlElementBase controlElement,
ControlElementViewModel copyFrom)
: this(controlElement)
{
Elements = copyFrom.Elements;
((ControlElementBase)Element).Children = controlElement.Children;
}
#endregion
#region Public methods
@ -64,7 +80,7 @@ namespace zaaReloaded2.ViewModels
Elements.Add(viewModel);
viewModel.Parent = this;
ControlElementBase e = Element as ControlElementBase;
e.FormatElements.Add(viewModel.RevealModelObject() as FormatElementBase);
e.Children.Add(viewModel.RevealModelObject() as FormatElementBase);
}
public void RemoveChildElement(FormatElementViewModel viewModel)
@ -75,13 +91,15 @@ namespace zaaReloaded2.ViewModels
"Cannot remove child view model that is not in the collection.");
}
Elements.Remove(viewModel);
((ControlElementBase)Element).FormatElements
((ControlElementBase)Element).Children
.Remove(viewModel.RevealModelObject() as FormatElementBase);
viewModel.Parent = null;
}
#endregion
#region Overrides
public override object Clone()
{
ControlElementViewModel clone = new ControlElementViewModel();
@ -94,5 +112,7 @@ namespace zaaReloaded2.ViewModels
}
return clone;
}
#endregion
}
}

View File

@ -29,7 +29,9 @@ namespace zaaReloaded2.ViewModels
{
/// <summary>
/// View model that presents a list of zaaReloaded2.Contorller.Elements.ElementBase
/// classes to choose from.
/// classes to choose from. Depending on which constructor is used, this view model
/// presents either a list of ControlElementBase-derived classes, a list of
/// FormatElementBase-derived classes, or both.
/// </summary>
class ElementPickerViewModel : ViewModelBase
{
@ -98,7 +100,7 @@ namespace zaaReloaded2.ViewModels
{
AddCategory(
new CategoryViewModel(
"Kontroll-Elemente",
Properties.Settings.Default.ControlElementLabel,
new Collection<ViewModelBase>()
{
CreateControlElementViewModel(new SelectFirstDay()),
@ -108,13 +110,27 @@ namespace zaaReloaded2.ViewModels
)
);
}
CreateFormatElementViewModels();
}
/// <summary>
/// Creates a new element picker for control elements only;
/// the selected ControlElementVieModel will copy the Elements
/// property from a source view model.
/// </summary>
/// <param name="copyFromViewModel">ControlElementViewModel
/// whose Elements property to copy.</param>
public ElementPickerViewModel(ControlElementViewModel copyFromViewModel)
{
Categories = new List<CategoryViewModel>();
AddCategory(
new CategoryViewModel(
"Ausgabe-Elemente",
Properties.Settings.Default.ControlElementLabel,
new Collection<ViewModelBase>()
{
CreateFormatElementViewModel("Laborparameter", new Items()),
CreateFormatElementViewModel("Beliebiger Text", new CustomText()),
CreateControlElementViewModel(new SelectFirstDay(), copyFromViewModel),
CreateControlElementViewModel(new SelectLastDay(), copyFromViewModel),
CreateControlElementViewModel(new SelectEachDay(), copyFromViewModel)
}
)
);
@ -124,6 +140,20 @@ namespace zaaReloaded2.ViewModels
#region Private methods
void CreateFormatElementViewModels()
{
AddCategory(
new CategoryViewModel(
Properties.Settings.Default.FormatElementLabel,
new Collection<ViewModelBase>()
{
CreateFormatElementViewModel("Laborparameter", new Items()),
CreateFormatElementViewModel("Beliebiger Text", new CustomText()),
}
)
);
}
void AddCategory(CategoryViewModel category)
{
category.PropertyChanged += ElementViewModel_PropertyChanged;
@ -143,6 +173,15 @@ namespace zaaReloaded2.ViewModels
return vm;
}
ViewModelBase CreateControlElementViewModel(
ControlElementBase element, ControlElementViewModel copyFromViewModel)
{
ControlElementViewModel vm = new ControlElementViewModel(element, copyFromViewModel);
vm.DisplayString = element.Label;
vm.PropertyChanged += ElementViewModel_PropertyChanged;
return vm;
}
/// <summary>
/// Creates a new FormatElementViewModel that wraps a FormatElementBase
/// object and has a custom display string. The custom display string
@ -176,6 +215,7 @@ namespace zaaReloaded2.ViewModels
if (CanChooseElement())
{
ElementChosenMessage.Send(new ViewModelMessageContent(Selected));
DoCloseView();
}
}

View File

@ -42,6 +42,14 @@ namespace zaaReloaded2.ViewModels
}
}
public override string DisplayString
{
get
{
return Label;
}
}
#endregion
#region Constructors

View File

@ -20,6 +20,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using Bovender.Mvvm;
using zaaReloaded2.Controller.Elements;
namespace zaaReloaded2.ViewModels
@ -31,10 +32,10 @@ namespace zaaReloaded2.ViewModels
public string Content
{
[DebuggerStepThrough]
get { return ((FormatElementBase)Element).Content; }
get { return _content; }
set
{
((FormatElementBase)Element).Content = value;
_content = value;
OnPropertyChanged("Content");
}
}
@ -47,6 +48,24 @@ namespace zaaReloaded2.ViewModels
#endregion
#region Commands
public DelegatingCommand SaveCommand
{
get
{
if (_saveCommand == null)
{
_saveCommand = new DelegatingCommand(
param => DoSave(),
param => CanSave());
}
return _saveCommand;
}
}
#endregion
#region Constructors
public FormatElementViewModel() : base() { }
@ -55,10 +74,13 @@ namespace zaaReloaded2.ViewModels
: this()
{
Element = formatElement;
Content = ((FormatElementBase)Element).Content;
}
#endregion
#region Overrides
public override object Clone()
{
FormatElementViewModel clone = new FormatElementViewModel();
@ -66,5 +88,52 @@ namespace zaaReloaded2.ViewModels
clone.Element = Element;
return clone;
}
public override string DisplayString
{
get
{
if (String.IsNullOrEmpty(Content))
{
return _displayString;
}
else
{
return base.DisplayString;
}
}
set
{
_displayString = value;
}
}
#endregion
#region Private methods
void DoSave()
{
((FormatElementBase)Element).Content = _content;
// Writing the _content field to the model affects our
// DisplayString property; this is a hack to make it known.
OnPropertyChanged("DisplayString");
CloseViewCommand.Execute(null);
}
bool CanSave()
{
return !String.IsNullOrEmpty(Content);
}
#endregion
#region Fields
DelegatingCommand _saveCommand;
string _displayString;
string _content;
#endregion
}
}

View File

@ -238,8 +238,9 @@ namespace zaaReloaded2.ViewModels
Settings s = new Settings("Neu");
SettingsViewModel vm = new SettingsViewModel(s);
_repository.SettingsList.Add(s);
SettingsList.Add(vm);
AddSettingsViewModel(vm);
vm.IsSelected = true;
EditSettingsMessage.Send(new ViewModelMessageContent(vm));
}
bool CanDeleteSettings()
@ -291,6 +292,7 @@ namespace zaaReloaded2.ViewModels
AddSettingsViewModel(copy);
LastSelected.IsSelected = false;
copy.IsSelected = true;
EditSettingsMessage.Send(new ViewModelMessageContent(copy));
}
}

View File

@ -26,6 +26,7 @@ using Bovender.Mvvm.Messaging;
using zaaReloaded2.Controller;
using zaaReloaded2.Controller.Elements;
using zaaReloaded2.Formatter;
using System.Collections.ObjectModel;
namespace zaaReloaded2.ViewModels
{
@ -104,7 +105,12 @@ namespace zaaReloaded2.ViewModels
{
if (_referenceStyle == null)
{
_referenceStyle = new EnumProvider<ReferenceStyle>(_settings.ReferenceStyle);
_referenceStyle = new EnumProvider<ReferenceStyle>();
_referenceStyle.AsEnum = _settings.ReferenceStyle;
_referenceStyle.PropertyChanged += (sender, args) =>
{
_settings.ReferenceStyle = _referenceStyle.AsEnum;
};
}
return _referenceStyle;
}
@ -122,7 +128,7 @@ namespace zaaReloaded2.ViewModels
: base()
{
_settings = settings;
Elements = new List<ElementViewModel>();
Elements = new ObservableCollection<ElementViewModel>();
foreach (ElementBase element in settings.Elements)
{
ElementViewModel vm;
@ -177,6 +183,30 @@ namespace zaaReloaded2.ViewModels
}
}
public Message<ViewModelMessageContent> EditElementMessage
{
get
{
if (_editElementMessage == null)
{
_editElementMessage = new Message<ViewModelMessageContent>();
}
return _editElementMessage;
}
}
public Message<ViewModelMessageContent> ChangeControlElementMessage
{
get
{
if (_changeControlElementMessage == null)
{
_changeControlElementMessage = new Message<ViewModelMessageContent>();
}
return _changeControlElementMessage;
}
}
#endregion
#region Commands
@ -208,6 +238,20 @@ namespace zaaReloaded2.ViewModels
}
}
public DelegatingCommand EditElementCommand
{
get
{
if (_editElementCommand == null)
{
_editElementCommand = new DelegatingCommand(
param => DoEditElement(),
param => CanEditElement());
}
return _editElementCommand;
}
}
public DelegatingCommand DeleteElementCommand
{
get
@ -275,6 +319,8 @@ namespace zaaReloaded2.ViewModels
{
ElementViewModel newVM = args.Content.ViewModel as ElementViewModel;
AddElementViewModel(newVM);
newVM.IsSelected = true;
DoEditElement();
};
AddElementMessage.Send(new ViewModelMessageContent(picker));
}
@ -290,6 +336,8 @@ namespace zaaReloaded2.ViewModels
{
FormatElementViewModel newVM = args.Content.ViewModel as FormatElementViewModel;
AddChildElementViewModel(LastSelectedElement as ControlElementViewModel, newVM);
newVM.IsSelected = true;
DoEditElement();
};
AddChildElementMessage.Send(new ViewModelMessageContent(picker));
}
@ -300,6 +348,41 @@ namespace zaaReloaded2.ViewModels
return LastSelectedElement is ControlElementViewModel;
}
void DoEditElement()
{
if (CanEditElement())
{
if (LastSelectedElement is ControlElementViewModel)
{
ElementPickerViewModel picker = new ElementPickerViewModel(
LastSelectedElement as ControlElementViewModel);
picker.ElementChosenMessage.Sent += (sender, args) =>
{
// Replace the previously selected element with the new
// one that we get from the ElementPickerViewModel.
ElementViewModel newVM = args.Content.ViewModel as ElementViewModel;
Elements.Insert(
Elements.IndexOf(LastSelectedElement),
newVM);
Elements.Remove(LastSelectedElement);
newVM.PropertyChanged += ElementViewModel_PropertyChanged;
newVM.IsSelected = true;
};
ChangeControlElementMessage.Send(
new ViewModelMessageContent(picker));
}
else
{
EditElementMessage.Send(new ViewModelMessageContent(LastSelectedElement));
}
}
}
bool CanEditElement()
{
return LastSelectedElement != null && LastSelectedElement.IsSelected;
}
/// <summary>
/// Deletes the selected element.
/// </summary>
@ -403,10 +486,13 @@ namespace zaaReloaded2.ViewModels
Settings _settings;
DelegatingCommand _addElementCommand;
DelegatingCommand _addChildElementCommand;
DelegatingCommand _editElementCommand;
DelegatingCommand _deleteElementCommand;
DelegatingCommand _copyElementCommand;
Message<ViewModelMessageContent> _addElementMessage;
Message<ViewModelMessageContent> _addChildElementMessage;
Message<ViewModelMessageContent> _editElementMessage;
Message<ViewModelMessageContent> _changeControlElementMessage;
ElementViewModel _selectedElement;
EnumProvider<ReferenceStyle> _referenceStyle;