diff --git a/MVPLearning/BaseLibrary/BaseTextBox.cs b/MVPLearning/BaseLibrary/BaseTextBox.cs index 5a7de1f..5382b20 100644 --- a/MVPLearning/BaseLibrary/BaseTextBox.cs +++ b/MVPLearning/BaseLibrary/BaseTextBox.cs @@ -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); } diff --git a/MVPLearning/MainView.Designer.cs b/MVPLearning/MainView.Designer.cs index 7b2da60..eda7660 100644 --- a/MVPLearning/MainView.Designer.cs +++ b/MVPLearning/MainView.Designer.cs @@ -34,12 +34,14 @@ recordKeepingToolStripMenuItem = new ToolStripMenuItem(); sermonFilerToolStripMenuItem = new ToolStripMenuItem(); maintainSermonFilerToolStripMenuItem = new ToolStripMenuItem(); + testAreaToolStripMenuItem = new ToolStripMenuItem(); + bindToModelToolStripMenuItem = 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(1101, 24); @@ -71,7 +73,7 @@ // sermonFilerToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { maintainSermonFilerToolStripMenuItem }); sermonFilerToolStripMenuItem.Name = "sermonFilerToolStripMenuItem"; - sermonFilerToolStripMenuItem.Size = new Size(140, 22); + sermonFilerToolStripMenuItem.Size = new Size(180, 22); sermonFilerToolStripMenuItem.Text = "Sermon Filer"; // // maintainSermonFilerToolStripMenuItem @@ -81,6 +83,20 @@ maintainSermonFilerToolStripMenuItem.Text = "Maintain Sermon Filer"; maintainSermonFilerToolStripMenuItem.Click += MaintainSermonFilerToolStripMenuItem_Click; // + // testAreaToolStripMenuItem + // + testAreaToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { bindToModelToolStripMenuItem }); + testAreaToolStripMenuItem.Name = "testAreaToolStripMenuItem"; + testAreaToolStripMenuItem.Size = new Size(66, 20); + testAreaToolStripMenuItem.Text = "Test Area"; + // + // bindToModelToolStripMenuItem + // + bindToModelToolStripMenuItem.Name = "bindToModelToolStripMenuItem"; + bindToModelToolStripMenuItem.Size = new Size(180, 22); + bindToModelToolStripMenuItem.Text = "Bind To Model"; + bindToModelToolStripMenuItem.Click += BindToModelToolStripMenuItem_Click; + // // MainView // AutoScaleDimensions = new SizeF(7F, 15F); @@ -105,5 +121,7 @@ private ToolStripMenuItem recordKeepingToolStripMenuItem; private ToolStripMenuItem sermonFilerToolStripMenuItem; private ToolStripMenuItem maintainSermonFilerToolStripMenuItem; + private ToolStripMenuItem testAreaToolStripMenuItem; + private ToolStripMenuItem bindToModelToolStripMenuItem; } } diff --git a/MVPLearning/MainView.cs b/MVPLearning/MainView.cs index 1c699dd..237f555 100644 --- a/MVPLearning/MainView.cs +++ b/MVPLearning/MainView.cs @@ -1,4 +1,5 @@ using MVPLearning.RecordKeeping.SermonFiler; +using MVPLearning.TestingArea.ModelProperties; namespace MVPLearning { @@ -18,5 +19,10 @@ namespace MVPLearning { Application.Exit(); } + + private void BindToModelToolStripMenuItem_Click(object sender, EventArgs e) + { + _ = new ModelPropertiesPresenter(new ModelPropertiesView() { MdiParent = this }); + } } } diff --git a/MVPLearning/TestingArea/ModelProperties/IModelPropertiesView.cs b/MVPLearning/TestingArea/ModelProperties/IModelPropertiesView.cs new file mode 100644 index 0000000..66c307d --- /dev/null +++ b/MVPLearning/TestingArea/ModelProperties/IModelPropertiesView.cs @@ -0,0 +1,10 @@ + +namespace MVPLearning.TestingArea.ModelProperties +{ + internal interface IModelPropertiesView + { + event EventHandler? ButtonClick; + + void LoadData(ModelPropertiesModel model); + } +} \ No newline at end of file diff --git a/MVPLearning/TestingArea/ModelProperties/ModelPropertiesModel.cs b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesModel.cs index 8f8f94d..018b38c 100644 --- a/MVPLearning/TestingArea/ModelProperties/ModelPropertiesModel.cs +++ b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesModel.cs @@ -11,5 +11,16 @@ namespace MVPLearning.TestingArea.ModelProperties { 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(); + } } } diff --git a/MVPLearning/TestingArea/ModelProperties/ModelPropertiesPresenter.cs b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesPresenter.cs new file mode 100644 index 0000000..68e10e2 --- /dev/null +++ b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesPresenter.cs @@ -0,0 +1,25 @@ +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; + if (_view is Form form) { form.Show(); } + } + + private void ButtonClick(object? sender, string e) + { + _view.LoadData(new() { FirstName = e }); + } + } +} diff --git a/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.Designer.cs b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.Designer.cs new file mode 100644 index 0000000..133ae3d --- /dev/null +++ b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.Designer.cs @@ -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 + { /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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; + } +} diff --git a/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.cs b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.cs new file mode 100644 index 0000000..cbe30dc --- /dev/null +++ b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.cs @@ -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? ButtonClick; + } +} diff --git a/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.resx b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/MVPLearning/TestingArea/ModelProperties/ModelPropertiesView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file