diff --git a/MVPLearning/MainView.Designer.cs b/MVPLearning/MainView.Designer.cs index 6167463..54b562f 100644 --- a/MVPLearning/MainView.Designer.cs +++ b/MVPLearning/MainView.Designer.cs @@ -37,6 +37,7 @@ testAreaToolStripMenuItem = new ToolStripMenuItem(); bindToModelToolStripMenuItem = new ToolStripMenuItem(); bindToViewToolStripMenuItem = new ToolStripMenuItem(); + bindToViewWithEqualityToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); SuspendLayout(); // @@ -86,7 +87,7 @@ // // testAreaToolStripMenuItem // - testAreaToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { bindToModelToolStripMenuItem, bindToViewToolStripMenuItem }); + testAreaToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { bindToModelToolStripMenuItem, bindToViewToolStripMenuItem, bindToViewWithEqualityToolStripMenuItem }); testAreaToolStripMenuItem.Name = "testAreaToolStripMenuItem"; testAreaToolStripMenuItem.Size = new Size(66, 20); testAreaToolStripMenuItem.Text = "Test Area"; @@ -94,17 +95,24 @@ // bindToModelToolStripMenuItem // bindToModelToolStripMenuItem.Name = "bindToModelToolStripMenuItem"; - bindToModelToolStripMenuItem.Size = new Size(180, 22); + bindToModelToolStripMenuItem.Size = new Size(212, 22); bindToModelToolStripMenuItem.Text = "Bind To Model"; bindToModelToolStripMenuItem.Click += BindToModelToolStripMenuItem_Click; // // bindToViewToolStripMenuItem // bindToViewToolStripMenuItem.Name = "bindToViewToolStripMenuItem"; - bindToViewToolStripMenuItem.Size = new Size(180, 22); + 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; + // // MainView // AutoScaleDimensions = new SizeF(7F, 15F); @@ -132,5 +140,6 @@ private ToolStripMenuItem testAreaToolStripMenuItem; private ToolStripMenuItem bindToModelToolStripMenuItem; private ToolStripMenuItem bindToViewToolStripMenuItem; + private ToolStripMenuItem bindToViewWithEqualityToolStripMenuItem; } } diff --git a/MVPLearning/MainView.cs b/MVPLearning/MainView.cs index d2b2b42..33a5e03 100644 --- a/MVPLearning/MainView.cs +++ b/MVPLearning/MainView.cs @@ -1,5 +1,6 @@ using MVPLearning.RecordKeeping.SermonFiler; using MVPLearning.TestingArea.ModelProperties; +using MVPLearning.TestingArea.ViewModelEquality; using MVPLearning.TestingArea.ViewProperties; namespace MVPLearning @@ -30,5 +31,10 @@ namespace MVPLearning { _ = new ViewPropertiesPresenter(new ViewPropertiesView() { MdiParent = this }); } + + private void BindToViewWithEqualityToolStripMenuItem_Click(object sender, EventArgs e) + { + _ = new ViewModelEqualityPresenter(new ViewModelEqualityView() { MdiParent = this }); + } } } diff --git a/MVPLearning/TestingArea/ViewModelEquality/IViewModelEqualityView.cs b/MVPLearning/TestingArea/ViewModelEquality/IViewModelEqualityView.cs new file mode 100644 index 0000000..095b5b4 --- /dev/null +++ b/MVPLearning/TestingArea/ViewModelEquality/IViewModelEqualityView.cs @@ -0,0 +1,11 @@ +using MVPLearning.TestingArea.ViewProperties; + +namespace MVPLearning.TestingArea.ViewModelEquality +{ + public interface IViewModelEqualityView + { + event EventHandler? ButtonClick; + + void LoadData(ViewModelEqualityModel model); + } +} \ No newline at end of file diff --git a/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityModel.cs b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityModel.cs new file mode 100644 index 0000000..a2ebeae --- /dev/null +++ b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityModel.cs @@ -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); + } + } +} diff --git a/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityPresenter.cs b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityPresenter.cs new file mode 100644 index 0000000..68da12b --- /dev/null +++ b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityPresenter.cs @@ -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 }); + } + } +} diff --git a/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.Designer.cs b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.Designer.cs new file mode 100644 index 0000000..77a5437 --- /dev/null +++ b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.Designer.cs @@ -0,0 +1,111 @@ +namespace MVPLearning.TestingArea.ViewModelEquality +{ + partial class ViewModelEqualityView + { + /// + /// 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(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; + } +} \ No newline at end of file diff --git a/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.cs b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.cs new file mode 100644 index 0000000..83e02a2 --- /dev/null +++ b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.cs @@ -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? 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); } + } +} diff --git a/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.resx b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/MVPLearning/TestingArea/ViewModelEquality/ViewModelEqualityView.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