Compare commits
15 Commits
bbd77d2bc0
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e4e23d6d23 | |||
| fe3a06890d | |||
| 6577b5ef43 | |||
| 0d50c5db83 | |||
|
|
4deedd3339 | ||
|
|
411b5722e2 | ||
|
|
177237699e | ||
|
|
7d25f11786 | ||
| 73281bd14e | |||
| eef43de757 | |||
| 0eb92d6472 | |||
| 155d629ad0 | |||
| 6a3a564d77 | |||
| 95163afa67 | |||
| f0426c35d6 |
12
MVPLearning/BaseLibrary/BaseButton.cs
Normal file
12
MVPLearning/BaseLibrary/BaseButton.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.BaseLibrary
|
||||
{
|
||||
public class BaseButton : Button
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ namespace MVPLearning.BaseLibrary
|
||||
}
|
||||
public void Bind(object datasource, string dataproperty)
|
||||
{
|
||||
var oldBinding = this.DataBindings[nameof(BoundValue)];
|
||||
var oldBinding = DataBindings[nameof(BoundValue)];
|
||||
if (oldBinding != null) { DataBindings.Remove(oldBinding); }
|
||||
|
||||
var newBinding = new Binding(nameof(BoundValue), datasource, dataproperty, true);
|
||||
@@ -50,23 +50,11 @@ namespace MVPLearning.BaseLibrary
|
||||
}
|
||||
protected override void OnValueChanged(EventArgs eventargs)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine("OnValueChanged");
|
||||
base.OnValueChanged(eventargs);
|
||||
BoundValue = Value;
|
||||
Format = DateTimePickerFormat.Custom;
|
||||
CustomFormat = Checked ? "MM/dd/yyyy" : " ";
|
||||
}
|
||||
protected override void OnValidated(EventArgs e)
|
||||
{
|
||||
base.OnValidated(e);
|
||||
}
|
||||
protected override void OnValidating(CancelEventArgs e)
|
||||
{
|
||||
base.OnValidating(e);
|
||||
System.Diagnostics.Debug.WriteLine("OnValidating");
|
||||
System.Diagnostics.Debug.WriteLine($"Value: {Value}");
|
||||
System.Diagnostics.Debug.WriteLine($"BoundValue: {BoundValue}");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.BaseLibrary
|
||||
{
|
||||
public class BaseForm : Form
|
||||
public class BaseForm : Form, INotifyPropertyChanged
|
||||
{
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "")
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "")
|
||||
{
|
||||
if (EqualityComparer<T>.Default.Equals(storage, value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
storage = value;
|
||||
RaisePropertyChanged(propertyName);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
120
MVPLearning/BaseLibrary/BaseForm.resx
Normal file
120
MVPLearning/BaseLibrary/BaseForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
12
MVPLearning/BaseLibrary/BaseLabel.cs
Normal file
12
MVPLearning/BaseLibrary/BaseLabel.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.BaseLibrary
|
||||
{
|
||||
public class BaseLabel : Label
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -17,7 +17,7 @@ namespace MVPLearning.BaseLibrary
|
||||
var oldBinding = DataBindings[nameof(Text)];
|
||||
if (oldBinding != null) { DataBindings.Remove(oldBinding); }
|
||||
|
||||
var newBinding = new Binding(nameof(Text), datasource, dataproperty, false);
|
||||
var newBinding = new Binding(nameof(Text), datasource, dataproperty, false, DataSourceUpdateMode.OnPropertyChanged);
|
||||
DataBindings.Add(newBinding);
|
||||
}
|
||||
|
||||
|
||||
56
MVPLearning/MainView.Designer.cs
generated
56
MVPLearning/MainView.Designer.cs
generated
@@ -34,15 +34,20 @@
|
||||
recordKeepingToolStripMenuItem = new ToolStripMenuItem();
|
||||
sermonFilerToolStripMenuItem = new ToolStripMenuItem();
|
||||
maintainSermonFilerToolStripMenuItem = new ToolStripMenuItem();
|
||||
testAreaToolStripMenuItem = new ToolStripMenuItem();
|
||||
bindToModelToolStripMenuItem = new ToolStripMenuItem();
|
||||
bindToViewToolStripMenuItem = new ToolStripMenuItem();
|
||||
bindToViewWithEqualityToolStripMenuItem = new ToolStripMenuItem();
|
||||
validateModelToolStripMenuItem = new ToolStripMenuItem();
|
||||
menuStrip1.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// menuStrip1
|
||||
//
|
||||
menuStrip1.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem, recordKeepingToolStripMenuItem });
|
||||
menuStrip1.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem, recordKeepingToolStripMenuItem, testAreaToolStripMenuItem });
|
||||
menuStrip1.Location = new Point(0, 0);
|
||||
menuStrip1.Name = "menuStrip1";
|
||||
menuStrip1.Size = new Size(800, 24);
|
||||
menuStrip1.Size = new Size(1101, 24);
|
||||
menuStrip1.TabIndex = 1;
|
||||
menuStrip1.Text = "menuStrip1";
|
||||
//
|
||||
@@ -56,7 +61,7 @@
|
||||
// exitToolStripMenuItem
|
||||
//
|
||||
exitToolStripMenuItem.Name = "exitToolStripMenuItem";
|
||||
exitToolStripMenuItem.Size = new Size(180, 22);
|
||||
exitToolStripMenuItem.Size = new Size(93, 22);
|
||||
exitToolStripMenuItem.Text = "E&xit";
|
||||
exitToolStripMenuItem.Click += ExitToolStripMenuItem_Click;
|
||||
//
|
||||
@@ -71,7 +76,7 @@
|
||||
//
|
||||
sermonFilerToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { maintainSermonFilerToolStripMenuItem });
|
||||
sermonFilerToolStripMenuItem.Name = "sermonFilerToolStripMenuItem";
|
||||
sermonFilerToolStripMenuItem.Size = new Size(180, 22);
|
||||
sermonFilerToolStripMenuItem.Size = new Size(140, 22);
|
||||
sermonFilerToolStripMenuItem.Text = "Sermon Filer";
|
||||
//
|
||||
// maintainSermonFilerToolStripMenuItem
|
||||
@@ -81,11 +86,47 @@
|
||||
maintainSermonFilerToolStripMenuItem.Text = "Maintain Sermon Filer";
|
||||
maintainSermonFilerToolStripMenuItem.Click += MaintainSermonFilerToolStripMenuItem_Click;
|
||||
//
|
||||
// testAreaToolStripMenuItem
|
||||
//
|
||||
testAreaToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { bindToModelToolStripMenuItem, bindToViewToolStripMenuItem, bindToViewWithEqualityToolStripMenuItem });
|
||||
testAreaToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { bindToModelToolStripMenuItem, bindToViewToolStripMenuItem, validateModelToolStripMenuItem });
|
||||
testAreaToolStripMenuItem.Name = "testAreaToolStripMenuItem";
|
||||
testAreaToolStripMenuItem.Size = new Size(66, 20);
|
||||
testAreaToolStripMenuItem.Text = "Test Area";
|
||||
//
|
||||
// bindToModelToolStripMenuItem
|
||||
//
|
||||
bindToModelToolStripMenuItem.Name = "bindToModelToolStripMenuItem";
|
||||
bindToModelToolStripMenuItem.Size = new Size(212, 22);
|
||||
bindToModelToolStripMenuItem.Text = "Bind To Model";
|
||||
bindToModelToolStripMenuItem.Click += BindToModelToolStripMenuItem_Click;
|
||||
//
|
||||
// bindToViewToolStripMenuItem
|
||||
//
|
||||
bindToViewToolStripMenuItem.Name = "bindToViewToolStripMenuItem";
|
||||
bindToViewToolStripMenuItem.Size = new Size(212, 22);
|
||||
bindToViewToolStripMenuItem.Text = "Bind To View";
|
||||
bindToViewToolStripMenuItem.Click += BindToViewToolStripMenuItem_Click;
|
||||
//
|
||||
// bindToViewWithEqualityToolStripMenuItem
|
||||
//
|
||||
bindToViewWithEqualityToolStripMenuItem.Name = "bindToViewWithEqualityToolStripMenuItem";
|
||||
bindToViewWithEqualityToolStripMenuItem.Size = new Size(212, 22);
|
||||
bindToViewWithEqualityToolStripMenuItem.Text = "Bind To View with Equality";
|
||||
bindToViewWithEqualityToolStripMenuItem.Click += BindToViewWithEqualityToolStripMenuItem_Click;
|
||||
//
|
||||
// validateModelToolStripMenuItem
|
||||
//
|
||||
validateModelToolStripMenuItem.Name = "validateModelToolStripMenuItem";
|
||||
validateModelToolStripMenuItem.Size = new Size(180, 22);
|
||||
validateModelToolStripMenuItem.Text = "Validate Model";
|
||||
validateModelToolStripMenuItem.Click += ValidateModelToolStripMenuItem_Click;
|
||||
//
|
||||
// MainView
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(800, 450);
|
||||
ClientSize = new Size(1101, 636);
|
||||
Controls.Add(menuStrip1);
|
||||
IsMdiContainer = true;
|
||||
MainMenuStrip = menuStrip1;
|
||||
@@ -105,5 +146,10 @@
|
||||
private ToolStripMenuItem recordKeepingToolStripMenuItem;
|
||||
private ToolStripMenuItem sermonFilerToolStripMenuItem;
|
||||
private ToolStripMenuItem maintainSermonFilerToolStripMenuItem;
|
||||
private ToolStripMenuItem testAreaToolStripMenuItem;
|
||||
private ToolStripMenuItem bindToModelToolStripMenuItem;
|
||||
private ToolStripMenuItem bindToViewToolStripMenuItem;
|
||||
private ToolStripMenuItem bindToViewWithEqualityToolStripMenuItem;
|
||||
private ToolStripMenuItem validateModelToolStripMenuItem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
using MVPLearning.RecordKeeping.SermonFiler;
|
||||
using MVPLearning.TestingArea.ModelProperties;
|
||||
using MVPLearning.TestingArea.ViewModelEquality;
|
||||
using MVPLearning.TestingArea.Validation;
|
||||
using MVPLearning.TestingArea.ViewProperties;
|
||||
|
||||
namespace MVPLearning
|
||||
{
|
||||
@@ -18,5 +22,25 @@ namespace MVPLearning
|
||||
{
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
private void BindToModelToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
_ = new ModelPropertiesPresenter(new ModelPropertiesView() { MdiParent = this });
|
||||
}
|
||||
|
||||
private void BindToViewToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
_ = new ViewPropertiesPresenter(new ViewPropertiesView() { MdiParent = this });
|
||||
}
|
||||
|
||||
private void BindToViewWithEqualityToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
_ = new ViewModelEqualityPresenter(new ViewModelEqualityView() { MdiParent = this });
|
||||
}
|
||||
|
||||
private void ValidateModelToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
_ = new ValidateController(new ValidateForm() { MdiParent = this });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
event EventHandler? BrowseButtonClicked;
|
||||
event EventHandler<string>? LaunchButtonClicked;
|
||||
event EventHandler<MaintainSermonFilerModel>? SaveButtonClicked;
|
||||
event EventHandler? CancelButtonClicked;
|
||||
event EventHandler<int>? CancelButtonClicked;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -22,10 +22,8 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
private string _minister = string.Empty;
|
||||
public string Where { get => _where; set => SetProperty(ref _where, value); }
|
||||
private string _where = string.Empty;
|
||||
public string Ref_No { get => _ref_No; set => SetProperty(ref _where, value); }
|
||||
#pragma warning disable IDE0044 // Add readonly modifier
|
||||
public string Ref_No { get => _ref_No; set => SetProperty(ref _ref_No, value); }
|
||||
private string _ref_No = string.Empty;
|
||||
#pragma warning restore IDE0044 // Add readonly modifier
|
||||
public string Notes { get => _notes; set => SetProperty(ref _notes, value); }
|
||||
private string _notes = string.Empty;
|
||||
public string Filename { get => _filename; set => SetProperty(ref _filename, value); }
|
||||
@@ -69,6 +67,7 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
hash.Add(Filename);
|
||||
hash.Add(Web);
|
||||
return hash.ToHashCode();
|
||||
//return base.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,19 +16,9 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
public MaintainSermonFilerView()
|
||||
{
|
||||
InitializeComponent();
|
||||
_model = new() { Title = "Constructor value"};
|
||||
_model.PropertyChanged += ModelChanged;
|
||||
TextBoxTitle.Bind(_model, nameof(_model.Title));
|
||||
TextBoxTitle.GotFocus += TextBoxTitle_GotFocus;
|
||||
TextBoxTitle.LostFocus += TextBoxTitle_LostFocus;
|
||||
TextBoxScriptureReference.Bind(_model, nameof(_model.Scripture));
|
||||
DatePickerWhenDelivered.Bind(_model, nameof(_model.When));
|
||||
TextBoxSubject.Bind(_model, nameof(_model.Subject));
|
||||
TextBoxWhoDelivered.Bind(_model, nameof(_model.Minister));
|
||||
TextBoxWhereDelivered.Bind(_model, nameof(_model.Where));
|
||||
TextBoxReferenceNumber.Bind(_model, nameof(_model.Ref_No));
|
||||
TextBoxNotes.Bind(_model, nameof(_model.Notes));
|
||||
TextBoxFileName.Bind(_model, nameof(_model.Filename));
|
||||
TextBoxWebUrl.Bind(_model, nameof(_model.Web));
|
||||
BindControls();
|
||||
//TextBoxFileName.TextChanged += TextBoxFileName_TextChanged ;
|
||||
//ButtonLaunch.Enabled = !string.IsNullOrEmpty(_model.Filename);
|
||||
}
|
||||
@@ -36,6 +26,7 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
{
|
||||
if (model == null) { return; }
|
||||
_loadedModel = model;
|
||||
_model.Seid = model.Seid;
|
||||
_model.Title = model.Title;
|
||||
_model.Scripture = model.Scripture;
|
||||
_model.When = model.When;
|
||||
@@ -47,7 +38,54 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
_model.Filename = model.Filename;
|
||||
_model.Web = model.Web;
|
||||
//EnableButtonLaunch();
|
||||
|
||||
Title = _model.Title;
|
||||
Scripture = _model.Scripture;
|
||||
When = _model.When;
|
||||
Subject = _model.Subject;
|
||||
Minister = _model.Minister;
|
||||
Where = _model.Where;
|
||||
Ref_No = _model.Ref_No;
|
||||
Notes = _model.Notes;
|
||||
Filename = _model.Filename;
|
||||
Web = _model.Web;
|
||||
}
|
||||
public void BindControls()
|
||||
{
|
||||
TextBoxTitle.Bind(this, nameof(Title));
|
||||
TextBoxTitle.GotFocus += TextBoxTitle_GotFocus;
|
||||
TextBoxTitle.LostFocus += TextBoxTitle_LostFocus;
|
||||
TextBoxScriptureReference.Bind(this, nameof(Scripture));
|
||||
DatePickerWhenDelivered.Bind(this, nameof(When));
|
||||
TextBoxSubject.Bind(this, nameof(Subject));
|
||||
TextBoxWhoDelivered.Bind(this, nameof(Minister));
|
||||
TextBoxWhereDelivered.Bind(this, nameof(Where));
|
||||
TextBoxReferenceNumber.Bind(this, nameof(Ref_No));
|
||||
TextBoxNotes.Bind(this, nameof(Notes));
|
||||
TextBoxFileName.Bind(this, nameof(Filename));
|
||||
TextBoxWebUrl.Bind(this, nameof(Web));
|
||||
|
||||
}
|
||||
private string _title = string.Empty;
|
||||
public string Title { get => _title; set { if (SetProperty(ref _title, value)) { _model.Title = value; } } }
|
||||
private string _scripture = string.Empty;
|
||||
public string Scripture { get => _scripture; set { if (SetProperty(ref _scripture, value)) { _model.Scripture= value; } } }
|
||||
private DateTime? _when = null;
|
||||
public DateTime? When { get => _when; set { if (SetProperty(ref _when, value)) { _model.When = value; } } }
|
||||
private string _subject = string.Empty;
|
||||
public string Subject { get => _subject; set { if (SetProperty(ref _subject, value)) { _model.Subject = value; } } }
|
||||
private string _minister = string.Empty;
|
||||
public string Minister { get => _minister; set { if (SetProperty(ref _minister, value)) { _model.Minister = value; } } }
|
||||
private string _where = string.Empty;
|
||||
public string Where { get => _where; set { if (SetProperty(ref _where, value)) { _model.Where = value; } } }
|
||||
private string _ref_no = string.Empty;
|
||||
public string Ref_No { get => _ref_no; set { if (SetProperty(ref _ref_no, value)) { _model.Ref_No = value; } } }
|
||||
private string _notes = string.Empty;
|
||||
public string Notes { get => _notes; set { if (SetProperty(ref _notes, value)) { _model.Notes = value; } } }
|
||||
private string _filename = string.Empty;
|
||||
public string Filename { get => _filename; set { if (SetProperty(ref _filename, value)) { _model.Filename = value; } } }
|
||||
private string _web = string.Empty;
|
||||
public string Web { get => _web; set { if (SetProperty(ref _web, value)) { _model.Web = value; } } }
|
||||
private void TextBoxTitle_LostFocus(object? sender, EventArgs e)
|
||||
{
|
||||
WarnTitleIsEmpty();
|
||||
@@ -62,6 +100,9 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
{
|
||||
if (e.PropertyName == nameof(_model.Filename)) { EnableButtonLaunch(); }
|
||||
if (e.PropertyName == nameof(_model.Title)) { WarnTitleIsEmpty(); }
|
||||
bool enableButtons = !_model.Equals(_loadedModel);
|
||||
ButtonSave.Enabled = enableButtons;
|
||||
ButtonCancel.Enabled = enableButtons;
|
||||
}
|
||||
private void WarnTitleIsEmpty()
|
||||
{
|
||||
@@ -85,7 +126,7 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
public event EventHandler? BrowseButtonClicked;
|
||||
public event EventHandler<string>? LaunchButtonClicked;
|
||||
public event EventHandler<MaintainSermonFilerModel>? SaveButtonClicked;
|
||||
public event EventHandler? CancelButtonClicked;
|
||||
public event EventHandler<int>? CancelButtonClicked;
|
||||
|
||||
private void AddButton_Click(object sender, EventArgs _) { if (CheckForChangedData()) { AddButtonClicked?.Invoke(sender, EventArgs.Empty); } }
|
||||
private void DeleteButton_Click(object sender, EventArgs _) { DeleteButtonClicked?.Invoke(sender, _model.Seid); }
|
||||
@@ -96,7 +137,7 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
private void BrowseButton_Click(object sender, EventArgs _) { if (CheckForChangedData()) { BrowseButtonClicked?.Invoke(sender, EventArgs.Empty); } }
|
||||
private void LaunchButton_Click(object sender, EventArgs _) { LaunchButtonClicked?.Invoke(sender, _model.Filename); }
|
||||
private void SaveButton_Click(object sender, EventArgs _) { SaveButtonClicked?.Invoke(sender, _model); }
|
||||
private void CancelButton_Click(object sender, EventArgs _) { if (_loadedModel != null) { LoadData(_loadedModel); } }
|
||||
private void CancelButton_Click(object sender, EventArgs _) { CancelButtonClicked?.Invoke(sender, _model.Seid); }
|
||||
|
||||
|
||||
|
||||
@@ -113,5 +154,6 @@ namespace MVPLearning.RecordKeeping.SermonFiler
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
@@ -26,36 +26,36 @@
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
|
||||
13
MVPLearning/TestingArea/AreaStrings.cs
Normal file
13
MVPLearning/TestingArea/AreaStrings.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea
|
||||
{
|
||||
static class AreaStrings
|
||||
{
|
||||
public static string LastNameEmpty {get; }= "Last name cannot be empty.";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
namespace MVPLearning.TestingArea.ModelProperties
|
||||
{
|
||||
internal interface IModelPropertiesView
|
||||
{
|
||||
event EventHandler<string>? ButtonClick;
|
||||
|
||||
void LoadData(ModelPropertiesModel model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using MVPLearning.Structure;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ModelProperties
|
||||
{
|
||||
internal class ModelPropertiesModel : ObservableObject
|
||||
{
|
||||
public string FirstName { get => _firstName; set => SetProperty(ref _firstName, value); }
|
||||
private string _firstName = string.Empty;
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
return obj is ModelPropertiesModel model &&
|
||||
FirstName == model.FirstName;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return base.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ModelProperties
|
||||
{
|
||||
internal class ModelPropertiesPresenter
|
||||
{
|
||||
private readonly IModelPropertiesView _view;
|
||||
|
||||
public ModelPropertiesPresenter(IModelPropertiesView view)
|
||||
{
|
||||
_view = view;
|
||||
_view.ButtonClick += ButtonClick;
|
||||
_view.LoadData(new() { FirstName = "Mary" });
|
||||
if (_view is Form form) { form.Show(); }
|
||||
}
|
||||
|
||||
private void ButtonClick(object? sender, string e)
|
||||
{
|
||||
_view.LoadData(new() { FirstName = e });
|
||||
}
|
||||
}
|
||||
}
|
||||
113
MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.Designer.cs
generated
Normal file
113
MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.Designer.cs
generated
Normal file
@@ -0,0 +1,113 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ModelProperties
|
||||
{
|
||||
internal partial class ModelPropertiesView
|
||||
{ /// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
baseTextBox1 = new BaseLibrary.BaseTextBox();
|
||||
button1 = new Button();
|
||||
button2 = new Button();
|
||||
button3 = new Button();
|
||||
label1 = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// baseTextBox1
|
||||
//
|
||||
baseTextBox1.BorderStyle = BorderStyle.FixedSingle;
|
||||
baseTextBox1.Location = new Point(12, 12);
|
||||
baseTextBox1.Name = "baseTextBox1";
|
||||
baseTextBox1.Size = new Size(260, 23);
|
||||
baseTextBox1.TabIndex = 0;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
button1.Location = new Point(12, 41);
|
||||
button1.Name = "button1";
|
||||
button1.Size = new Size(75, 23);
|
||||
button1.TabIndex = 1;
|
||||
button1.Text = "Mary";
|
||||
button1.UseVisualStyleBackColor = true;
|
||||
button1.Click += Button_Click;
|
||||
//
|
||||
// button2
|
||||
//
|
||||
button2.Location = new Point(105, 41);
|
||||
button2.Name = "button2";
|
||||
button2.Size = new Size(75, 23);
|
||||
button2.TabIndex = 2;
|
||||
button2.Text = "Sara";
|
||||
button2.UseVisualStyleBackColor = true;
|
||||
button2.Click += Button_Click;
|
||||
//
|
||||
// button3
|
||||
//
|
||||
button3.Location = new Point(197, 41);
|
||||
button3.Name = "button3";
|
||||
button3.Size = new Size(75, 23);
|
||||
button3.TabIndex = 3;
|
||||
button3.Text = "John";
|
||||
button3.UseVisualStyleBackColor = true;
|
||||
button3.Click += Button_Click;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Font = new Font("Segoe UI", 16F);
|
||||
label1.ForeColor = SystemColors.Highlight;
|
||||
label1.Location = new Point(11, 154);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(262, 30);
|
||||
label1.TabIndex = 4;
|
||||
label1.Text = "A change has been made.";
|
||||
//
|
||||
// ModelPropertiesView
|
||||
//
|
||||
ClientSize = new Size(284, 261);
|
||||
Controls.Add(label1);
|
||||
Controls.Add(button3);
|
||||
Controls.Add(button2);
|
||||
Controls.Add(button1);
|
||||
Controls.Add(baseTextBox1);
|
||||
Name = "ModelPropertiesView";
|
||||
Text = "Bind to Model";
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
#endregion
|
||||
|
||||
private BaseLibrary.BaseTextBox baseTextBox1;
|
||||
private Button button1;
|
||||
private Button button2;
|
||||
private Button button3;
|
||||
private Label label1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using MVPLearning.BaseLibrary;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ModelProperties
|
||||
{
|
||||
internal partial class ModelPropertiesView : BaseForm, IModelPropertiesView
|
||||
{
|
||||
private readonly ModelPropertiesModel _model = new();
|
||||
private ModelPropertiesModel? _loadedModel;
|
||||
public ModelPropertiesView()
|
||||
{
|
||||
InitializeComponent();
|
||||
baseTextBox1.Bind(_model, nameof(_model.FirstName));
|
||||
_model.PropertyChanged += ModelChanged;
|
||||
|
||||
}
|
||||
|
||||
private void ModelChanged(object? sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
label1.Visible = !_model.Equals(_loadedModel);
|
||||
}
|
||||
|
||||
public void LoadData(ModelPropertiesModel model)
|
||||
{
|
||||
_loadedModel = model;
|
||||
_model.FirstName = model.FirstName;
|
||||
}
|
||||
|
||||
private void Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
ButtonClick?.Invoke(this, ((Button)sender).Text);
|
||||
}
|
||||
|
||||
public event EventHandler<string>? ButtonClick;
|
||||
}
|
||||
}
|
||||
120
MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.resx
Normal file
120
MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
11
MVPLearning/TestingArea/Validation/IValidateForm.cs
Normal file
11
MVPLearning/TestingArea/Validation/IValidateForm.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
namespace MVPLearning.TestingArea.Validation
|
||||
{
|
||||
public interface IValidateForm
|
||||
{
|
||||
event EventHandler<ValidationModel>? Save;
|
||||
|
||||
void Invalid(ValidateInvalid model);
|
||||
void LoadForm(ValidationModel model);
|
||||
}
|
||||
}
|
||||
28
MVPLearning/TestingArea/Validation/ValidateController.cs
Normal file
28
MVPLearning/TestingArea/Validation/ValidateController.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.Validation
|
||||
{
|
||||
public class ValidateController
|
||||
{
|
||||
private readonly IValidateForm _form;
|
||||
|
||||
public ValidateController(IValidateForm form) {
|
||||
_form = form;
|
||||
_form.Save += Save;
|
||||
_form.LoadForm(new() { Id = 0, Firstname = "John", Lastname = "Doe" });
|
||||
if (_form is Form window) { window.Show(); }
|
||||
}
|
||||
|
||||
private void Save(object? sender, ValidationModel e)
|
||||
{
|
||||
if (e == null || string.IsNullOrEmpty(e.Lastname)) { _form.Invalid(new()); return; }
|
||||
|
||||
ValidationModel model = new() { Firstname = e.Firstname, Lastname = e.Lastname, Id = e.Id };
|
||||
_form.LoadForm(model);
|
||||
}
|
||||
}
|
||||
}
|
||||
121
MVPLearning/TestingArea/Validation/ValidateForm.Designer.cs
generated
Normal file
121
MVPLearning/TestingArea/Validation/ValidateForm.Designer.cs
generated
Normal file
@@ -0,0 +1,121 @@
|
||||
namespace MVPLearning.TestingArea.Validation
|
||||
{
|
||||
partial class ValidateForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
lblFirstname = new BaseLibrary.BaseLabel();
|
||||
txtFirstname = new BaseLibrary.BaseTextBox();
|
||||
txtLastname = new BaseLibrary.BaseTextBox();
|
||||
lblLastname = new BaseLibrary.BaseLabel();
|
||||
btnSave = new BaseLibrary.BaseButton();
|
||||
baseButton1 = new BaseLibrary.BaseButton();
|
||||
SuspendLayout();
|
||||
//
|
||||
// lblFirstname
|
||||
//
|
||||
lblFirstname.AutoSize = true;
|
||||
lblFirstname.Location = new Point(12, 9);
|
||||
lblFirstname.Name = "lblFirstname";
|
||||
lblFirstname.Size = new Size(65, 15);
|
||||
lblFirstname.TabIndex = 0;
|
||||
lblFirstname.Text = "First name:";
|
||||
//
|
||||
// txtFirstname
|
||||
//
|
||||
txtFirstname.BorderStyle = BorderStyle.FixedSingle;
|
||||
txtFirstname.Location = new Point(83, 7);
|
||||
txtFirstname.MaxLength = 20;
|
||||
txtFirstname.Name = "txtFirstname";
|
||||
txtFirstname.Size = new Size(155, 23);
|
||||
txtFirstname.TabIndex = 1;
|
||||
//
|
||||
// txtLastname
|
||||
//
|
||||
txtLastname.BorderStyle = BorderStyle.FixedSingle;
|
||||
txtLastname.Location = new Point(83, 36);
|
||||
txtLastname.MaxLength = 20;
|
||||
txtLastname.Name = "txtLastname";
|
||||
txtLastname.Size = new Size(155, 23);
|
||||
txtLastname.TabIndex = 3;
|
||||
//
|
||||
// lblLastname
|
||||
//
|
||||
lblLastname.AutoSize = true;
|
||||
lblLastname.Location = new Point(12, 38);
|
||||
lblLastname.Name = "lblLastname";
|
||||
lblLastname.Size = new Size(64, 15);
|
||||
lblLastname.TabIndex = 2;
|
||||
lblLastname.Text = "Last name:";
|
||||
//
|
||||
// btnSave
|
||||
//
|
||||
btnSave.Location = new Point(163, 65);
|
||||
btnSave.Name = "btnSave";
|
||||
btnSave.Size = new Size(75, 23);
|
||||
btnSave.TabIndex = 4;
|
||||
btnSave.Text = "Save";
|
||||
btnSave.UseVisualStyleBackColor = true;
|
||||
btnSave.Click += Save_Click;
|
||||
//
|
||||
// baseButton1
|
||||
//
|
||||
baseButton1.Location = new Point(83, 65);
|
||||
baseButton1.Name = "baseButton1";
|
||||
baseButton1.Size = new Size(75, 23);
|
||||
baseButton1.TabIndex = 5;
|
||||
baseButton1.Text = "Test";
|
||||
baseButton1.UseVisualStyleBackColor = true;
|
||||
baseButton1.Click += Test_Click;
|
||||
//
|
||||
// ValidateForm
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(331, 174);
|
||||
Controls.Add(baseButton1);
|
||||
Controls.Add(btnSave);
|
||||
Controls.Add(txtLastname);
|
||||
Controls.Add(lblLastname);
|
||||
Controls.Add(txtFirstname);
|
||||
Controls.Add(lblFirstname);
|
||||
Name = "ValidateForm";
|
||||
Text = "ValidateForm";
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private BaseLibrary.BaseLabel lblFirstname;
|
||||
private BaseLibrary.BaseTextBox txtFirstname;
|
||||
private BaseLibrary.BaseTextBox txtLastname;
|
||||
private BaseLibrary.BaseLabel lblLastname;
|
||||
private BaseLibrary.BaseButton btnSave;
|
||||
private BaseLibrary.BaseButton baseButton1;
|
||||
}
|
||||
}
|
||||
63
MVPLearning/TestingArea/Validation/ValidateForm.cs
Normal file
63
MVPLearning/TestingArea/Validation/ValidateForm.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using MVPLearning.BaseLibrary;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace MVPLearning.TestingArea.Validation
|
||||
{
|
||||
public partial class ValidateForm : BaseForm, IValidateForm
|
||||
{
|
||||
private readonly ValidationModel _model = new();
|
||||
private ValidationModel? _loadedModel;
|
||||
public ValidateForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
_model.PropertyChanged += ModelChanged;
|
||||
txtFirstname.Bind(_model, nameof(_model.Firstname));
|
||||
txtLastname.Bind(_model, nameof(_model.Lastname));
|
||||
}
|
||||
|
||||
private void ModelChanged(object? sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
EnableSave();
|
||||
}
|
||||
private void EnableSave()
|
||||
{
|
||||
bool enable = !_model.Equals(_loadedModel);
|
||||
btnSave.Enabled = enable;
|
||||
}
|
||||
public event EventHandler<ValidationModel>? Save;
|
||||
public void LoadForm(ValidationModel model)
|
||||
{
|
||||
_loadedModel = model;
|
||||
_model.Firstname = model.Firstname;
|
||||
_model.Lastname = model.Lastname;
|
||||
_model.Id = model.Id;
|
||||
EnableSave();
|
||||
}
|
||||
public void Invalid(ValidateInvalid model)
|
||||
{
|
||||
if (model.Lastname != null)
|
||||
{
|
||||
txtLastname.Focus();
|
||||
MessageBox.Show(model.Lastname, Text);
|
||||
}
|
||||
}
|
||||
|
||||
private void Save_Click(object sender, EventArgs e)
|
||||
{
|
||||
Save?.Invoke(this, _model);
|
||||
}
|
||||
|
||||
private void Test_Click(object sender, EventArgs e)
|
||||
{
|
||||
_model.Firstname = "Test";
|
||||
}
|
||||
}
|
||||
}
|
||||
120
MVPLearning/TestingArea/Validation/ValidateForm.resx
Normal file
120
MVPLearning/TestingArea/Validation/ValidateForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
13
MVPLearning/TestingArea/Validation/ValidateInvalid.cs
Normal file
13
MVPLearning/TestingArea/Validation/ValidateInvalid.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.Validation
|
||||
{
|
||||
public class ValidateInvalid
|
||||
{
|
||||
public string Lastname { get; set; } = AreaStrings.LastNameEmpty;
|
||||
}
|
||||
}
|
||||
32
MVPLearning/TestingArea/Validation/ValidationModel.cs
Normal file
32
MVPLearning/TestingArea/Validation/ValidationModel.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using MVPLearning.Structure;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.Validation
|
||||
{
|
||||
public class ValidationModel : ObservableObject
|
||||
{
|
||||
private string _firstname = string.Empty;
|
||||
private string _lastname = string.Empty;
|
||||
private int _id;
|
||||
|
||||
public string Firstname { get { return _firstname; } set { SetProperty(ref _firstname, value); } }
|
||||
public string Lastname { get { return _lastname; } set { SetProperty(ref _lastname, value); } }
|
||||
public int Id { get { return _id; } set { SetProperty(ref _id, value); } }
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
return obj is ValidationModel model &&
|
||||
Id == model.Id &&
|
||||
Firstname == model.Firstname &&
|
||||
Lastname == model.Lastname;
|
||||
}
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return base.GetHashCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using MVPLearning.TestingArea.ViewProperties;
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewModelEquality
|
||||
{
|
||||
public interface IViewModelEqualityView
|
||||
{
|
||||
event EventHandler<string>? ButtonClick;
|
||||
|
||||
void LoadData(ViewModelEqualityModel model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewModelEquality
|
||||
{
|
||||
public class ViewModelEqualityModel
|
||||
{
|
||||
public string FirstName { get; set; } = string.Empty;
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
return obj is ViewModelEqualityModel model &&
|
||||
FirstName == model.FirstName;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return HashCode.Combine(FirstName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewModelEquality
|
||||
{
|
||||
public class ViewModelEqualityPresenter
|
||||
{
|
||||
private readonly IViewModelEqualityView _view;
|
||||
|
||||
public ViewModelEqualityPresenter(IViewModelEqualityView view)
|
||||
{
|
||||
_view = view;
|
||||
_view.LoadData(new() { FirstName = "Mary" });
|
||||
_view.ButtonClick += ButtonClick;
|
||||
if (_view is Form form) { form.Show(); }
|
||||
}
|
||||
|
||||
private void ButtonClick(object? sender, string e)
|
||||
{
|
||||
_view.LoadData(new() { FirstName = e });
|
||||
}
|
||||
}
|
||||
}
|
||||
111
MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.Designer.cs
generated
Normal file
111
MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.Designer.cs
generated
Normal file
@@ -0,0 +1,111 @@
|
||||
namespace MVPLearning.TestingArea.ViewModelEquality
|
||||
{
|
||||
partial class ViewModelEqualityView
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
baseTextBox1 = new BaseLibrary.BaseTextBox();
|
||||
button1 = new Button();
|
||||
button2 = new Button();
|
||||
button3 = new Button();
|
||||
label1 = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// baseTextBox1
|
||||
//
|
||||
baseTextBox1.BorderStyle = BorderStyle.FixedSingle;
|
||||
baseTextBox1.Location = new Point(12, 12);
|
||||
baseTextBox1.Name = "baseTextBox1";
|
||||
baseTextBox1.Size = new Size(269, 23);
|
||||
baseTextBox1.TabIndex = 0;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
button1.Location = new Point(12, 41);
|
||||
button1.Name = "button1";
|
||||
button1.Size = new Size(75, 23);
|
||||
button1.TabIndex = 1;
|
||||
button1.Text = "Mary";
|
||||
button1.UseVisualStyleBackColor = true;
|
||||
button1.Click += Button_Click;
|
||||
//
|
||||
// button2
|
||||
//
|
||||
button2.Location = new Point(109, 41);
|
||||
button2.Name = "button2";
|
||||
button2.Size = new Size(75, 23);
|
||||
button2.TabIndex = 2;
|
||||
button2.Text = "Sara";
|
||||
button2.UseVisualStyleBackColor = true;
|
||||
button2.Click += Button_Click;
|
||||
//
|
||||
// button3
|
||||
//
|
||||
button3.Location = new Point(206, 41);
|
||||
button3.Name = "button3";
|
||||
button3.Size = new Size(75, 23);
|
||||
button3.TabIndex = 3;
|
||||
button3.Text = "John";
|
||||
button3.UseVisualStyleBackColor = true;
|
||||
button3.Click += Button_Click;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Font = new Font("Segoe UI", 16F);
|
||||
label1.ForeColor = SystemColors.Highlight;
|
||||
label1.Location = new Point(15, 107);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(262, 30);
|
||||
label1.TabIndex = 5;
|
||||
label1.Text = "A change has been made.";
|
||||
//
|
||||
// ViewModelEqualityView
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(293, 245);
|
||||
Controls.Add(label1);
|
||||
Controls.Add(button3);
|
||||
Controls.Add(button2);
|
||||
Controls.Add(button1);
|
||||
Controls.Add(baseTextBox1);
|
||||
Name = "ViewModelEqualityView";
|
||||
Text = "View Properties with Model Equality";
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private BaseLibrary.BaseTextBox baseTextBox1;
|
||||
private Button button1;
|
||||
private Button button2;
|
||||
private Button button3;
|
||||
private Label label1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using MVPLearning.BaseLibrary;
|
||||
using MVPLearning.TestingArea.ViewProperties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewModelEquality
|
||||
{
|
||||
public partial class ViewModelEqualityView : BaseForm, IViewModelEqualityView
|
||||
{
|
||||
public ViewModelEqualityView()
|
||||
{
|
||||
InitializeComponent();
|
||||
baseTextBox1.Bind(this, nameof(FirstName));
|
||||
PropertyChanged += ModelChanged;
|
||||
}
|
||||
|
||||
private void ModelChanged(object? sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
label1.Visible = !_model.Equals(_loadedModel);
|
||||
}
|
||||
|
||||
private readonly ViewModelEqualityModel _model = new();
|
||||
private ViewModelEqualityModel? _loadedModel;
|
||||
|
||||
private string _firstName = string.Empty;
|
||||
public string FirstName { get => _firstName; set { _model.FirstName = value; SetProperty(ref _firstName, value); } }
|
||||
public event EventHandler<string>? ButtonClick;
|
||||
public void LoadData(ViewModelEqualityModel model)
|
||||
{
|
||||
_loadedModel = model;
|
||||
FirstName = model.FirstName;
|
||||
}
|
||||
private void Button_Click(object sender, EventArgs e) { ButtonClick?.Invoke(this, ((Button)sender).Text); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewProperties
|
||||
{
|
||||
public interface IViewPropertiesView
|
||||
{
|
||||
string FirstName { get; set; }
|
||||
|
||||
event EventHandler<string> ButtonClick;
|
||||
|
||||
void LoadData(ViewPropertiesModel model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace MVPLearning.TestingArea.ViewProperties
|
||||
{
|
||||
public class ViewPropertiesModel
|
||||
{
|
||||
public string FirstName { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewProperties
|
||||
{
|
||||
internal class ViewPropertiesPresenter
|
||||
{
|
||||
private readonly ViewPropertiesView _view;
|
||||
|
||||
public ViewPropertiesPresenter(ViewPropertiesView view)
|
||||
{
|
||||
_view = view;
|
||||
_view.ButtonClick += ButtonClick;
|
||||
_view.LoadData(new() { FirstName = "Mary" });
|
||||
if (_view is Form form) { form.Show(); }
|
||||
}
|
||||
|
||||
private void ButtonClick(object? sender, string e)
|
||||
{
|
||||
_view.LoadData(new() { FirstName = e });
|
||||
}
|
||||
}
|
||||
}
|
||||
111
MVPLearning/TestingArea/ViewProperties/ViewPropertiesView.Designer.cs
generated
Normal file
111
MVPLearning/TestingArea/ViewProperties/ViewPropertiesView.Designer.cs
generated
Normal file
@@ -0,0 +1,111 @@
|
||||
namespace MVPLearning.TestingArea.ViewProperties
|
||||
{
|
||||
partial class ViewPropertiesView
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
baseTextBox1 = new BaseLibrary.BaseTextBox();
|
||||
button1 = new Button();
|
||||
button2 = new Button();
|
||||
button3 = new Button();
|
||||
label1 = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// baseTextBox1
|
||||
//
|
||||
baseTextBox1.BorderStyle = BorderStyle.FixedSingle;
|
||||
baseTextBox1.Location = new Point(12, 12);
|
||||
baseTextBox1.Name = "baseTextBox1";
|
||||
baseTextBox1.Size = new Size(308, 23);
|
||||
baseTextBox1.TabIndex = 0;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
button1.Location = new Point(12, 41);
|
||||
button1.Name = "button1";
|
||||
button1.Size = new Size(75, 23);
|
||||
button1.TabIndex = 1;
|
||||
button1.Text = "Mary";
|
||||
button1.UseVisualStyleBackColor = true;
|
||||
button1.Click += Button_Click;
|
||||
//
|
||||
// button2
|
||||
//
|
||||
button2.Location = new Point(129, 41);
|
||||
button2.Name = "button2";
|
||||
button2.Size = new Size(75, 23);
|
||||
button2.TabIndex = 2;
|
||||
button2.Text = "Sara";
|
||||
button2.UseVisualStyleBackColor = true;
|
||||
button2.Click += Button_Click;
|
||||
//
|
||||
// button3
|
||||
//
|
||||
button3.Location = new Point(245, 41);
|
||||
button3.Name = "button3";
|
||||
button3.Size = new Size(75, 23);
|
||||
button3.TabIndex = 3;
|
||||
button3.Text = "John";
|
||||
button3.UseVisualStyleBackColor = true;
|
||||
button3.Click += Button_Click;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Font = new Font("Segoe UI", 16F);
|
||||
label1.ForeColor = SystemColors.Highlight;
|
||||
label1.Location = new Point(35, 212);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(262, 30);
|
||||
label1.TabIndex = 4;
|
||||
label1.Text = "A change has been made.";
|
||||
//
|
||||
// ViewPropertiesView
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(332, 312);
|
||||
Controls.Add(label1);
|
||||
Controls.Add(button3);
|
||||
Controls.Add(button2);
|
||||
Controls.Add(button1);
|
||||
Controls.Add(baseTextBox1);
|
||||
Name = "ViewPropertiesView";
|
||||
Text = "Bind To View";
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private BaseLibrary.BaseTextBox baseTextBox1;
|
||||
private Button button1;
|
||||
private Button button2;
|
||||
private Button button3;
|
||||
private Label label1;
|
||||
}
|
||||
}
|
||||
39
MVPLearning/TestingArea/ViewProperties/ViewPropertiesView.cs
Normal file
39
MVPLearning/TestingArea/ViewProperties/ViewPropertiesView.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using MVPLearning.BaseLibrary;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace MVPLearning.TestingArea.ViewProperties
|
||||
{
|
||||
public partial class ViewPropertiesView : BaseForm, IViewPropertiesView
|
||||
{
|
||||
private ViewPropertiesModel? _loadedModel;
|
||||
public ViewPropertiesView()
|
||||
{
|
||||
InitializeComponent();
|
||||
baseTextBox1.Bind(this, nameof(FirstName));
|
||||
PropertyChanged += ModelChanged;
|
||||
}
|
||||
|
||||
private void ModelChanged(object? sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
label1.Visible = _loadedModel is not null && FirstName != _loadedModel.FirstName;
|
||||
}
|
||||
|
||||
private string _firstName = string.Empty;
|
||||
public string FirstName { get => _firstName; set { SetProperty(ref _firstName, value); } }
|
||||
public event EventHandler<string>? ButtonClick;
|
||||
public void LoadData(ViewPropertiesModel model)
|
||||
{
|
||||
_loadedModel = model;
|
||||
FirstName = model.FirstName;
|
||||
}
|
||||
private void Button_Click(object sender, EventArgs e) { ButtonClick?.Invoke(this, ((Button)sender).Text); }
|
||||
}
|
||||
}
|
||||
120
MVPLearning/TestingArea/ViewProperties/ViewPropertiesView.resx
Normal file
120
MVPLearning/TestingArea/ViewProperties/ViewPropertiesView.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
Reference in New Issue
Block a user