Skip to content

Commit e3ae96f

Browse files
committed
Add MVVM data binding: INotifyPropertyChanged on all controls, Bind/BindTwoWay API
BaseControl implements INotifyPropertyChanged with SetProperty() pattern. Migrate 134 property setters across 26 controls. Add DataBinding namespace with one-way, two-way, and converter bindings. Builders support deferred bindings via IControlBuilder<T>.
1 parent f42424b commit e3ae96f

62 files changed

Lines changed: 889 additions & 669 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

SharpConsoleUI/Builders/BarGraphBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Helpers;
1112
using SharpConsoleUI.Layout;
1213

@@ -15,7 +16,7 @@ namespace SharpConsoleUI.Builders
1516
/// <summary>
1617
/// Fluent builder for creating BarGraphControl instances.
1718
/// </summary>
18-
public class BarGraphBuilder
19+
public class BarGraphBuilder : IControlBuilder<BarGraphControl>
1920
{
2021
private readonly BarGraphControl _control;
2122

@@ -272,6 +273,7 @@ public BarGraphBuilder WithSmoothGradient(params Color[] colors)
272273
/// </summary>
273274
public BarGraphControl Build()
274275
{
276+
BindingHelper.ApplyDeferredBindings(this, _control);
275277
return _control;
276278
}
277279
}

SharpConsoleUI/Builders/ButtonBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Events;
1112
using SharpConsoleUI.Extensions;
1213
using SharpConsoleUI.Layout;
@@ -18,7 +19,7 @@ namespace SharpConsoleUI.Builders;
1819
/// <summary>
1920
/// Fluent builder for button controls
2021
/// </summary>
21-
public sealed class ButtonBuilder
22+
public sealed class ButtonBuilder : IControlBuilder<ButtonControl>
2223
{
2324
private string _text = "Button";
2425
private HorizontalAlignment _alignment = HorizontalAlignment.Left;
@@ -456,6 +457,7 @@ public ButtonControl Build()
456457
};
457458
}
458459

460+
BindingHelper.ApplyDeferredBindings(this, button);
459461
return button;
460462
}
461463

SharpConsoleUI/Builders/CheckboxBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Events;
1112
using SharpConsoleUI.Extensions;
1213
using SharpConsoleUI.Layout;
@@ -16,7 +17,7 @@ namespace SharpConsoleUI.Builders;
1617
/// <summary>
1718
/// Fluent builder for checkbox controls
1819
/// </summary>
19-
public sealed class CheckboxBuilder
20+
public sealed class CheckboxBuilder : IControlBuilder<CheckboxControl>
2021
{
2122
private string _label = "Checkbox";
2223
private bool _isChecked = false;
@@ -278,6 +279,7 @@ public CheckboxControl Build()
278279
};
279280
}
280281

282+
BindingHelper.ApplyDeferredBindings(this, checkbox);
281283
return checkbox;
282284
}
283285

SharpConsoleUI/Builders/DropdownBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Events;
1112
using SharpConsoleUI.Extensions;
1213
using SharpConsoleUI.Layout;
@@ -16,7 +17,7 @@ namespace SharpConsoleUI.Builders;
1617
/// <summary>
1718
/// Fluent builder for dropdown controls
1819
/// </summary>
19-
public sealed class DropdownBuilder
20+
public sealed class DropdownBuilder : IControlBuilder<DropdownControl>
2021
{
2122
private readonly List<DropdownItem> _items = new();
2223
private string _prompt = "Select...";
@@ -393,6 +394,7 @@ public DropdownControl Build()
393394
};
394395
}
395396

397+
BindingHelper.ApplyDeferredBindings(this, dropdown);
396398
return dropdown;
397399
}
398400

SharpConsoleUI/Builders/FigleControlBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Layout;
1112
using SharpConsoleUI.Parsing;
1213

@@ -15,7 +16,7 @@ namespace SharpConsoleUI.Builders;
1516
/// <summary>
1617
/// Fluent builder for Figlet ASCII art controls
1718
/// </summary>
18-
public sealed class FigleControlBuilder
19+
public sealed class FigleControlBuilder : IControlBuilder<FigleControl>
1920
{
2021
private string? _text;
2122
private Color? _color;
@@ -289,6 +290,7 @@ public FigleControl Build()
289290
if (_color.HasValue)
290291
control.Color = _color.Value;
291292

293+
BindingHelper.ApplyDeferredBindings(this, control);
292294
return control;
293295
}
294296

SharpConsoleUI/Builders/HorizontalGridBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Layout;
1112

1213
namespace SharpConsoleUI.Builders
@@ -24,7 +25,7 @@ namespace SharpConsoleUI.Builders
2425
/// .Build();
2526
/// </code>
2627
/// </example>
27-
public class HorizontalGridBuilder
28+
public class HorizontalGridBuilder : IControlBuilder<HorizontalGridControl>
2829
{
2930
private readonly HorizontalGridControl _grid = new();
3031
private readonly List<ColumnConfiguration> _columns = new();
@@ -245,6 +246,7 @@ public HorizontalGridControl Build()
245246
_grid.AddSplitter(index, new SplitterControl());
246247
}
247248

249+
BindingHelper.ApplyDeferredBindings(this, _grid);
248250
return _grid;
249251
}
250252

SharpConsoleUI/Builders/ListBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Events;
1112
using SharpConsoleUI.Extensions;
1213
using SharpConsoleUI.Layout;
@@ -17,7 +18,7 @@ namespace SharpConsoleUI.Builders;
1718
/// <summary>
1819
/// Fluent builder for list controls
1920
/// </summary>
20-
public sealed class ListBuilder
21+
public sealed class ListBuilder : IControlBuilder<ListControl>
2122
{
2223
private readonly List<ListItem> _items = new();
2324
private string _title = "List";
@@ -724,6 +725,7 @@ public ListControl Build()
724725
};
725726
}
726727

728+
BindingHelper.ApplyDeferredBindings(this, list);
727729
return list;
728730
}
729731

SharpConsoleUI/Builders/MarkupBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Events;
1112
using SharpConsoleUI.Extensions;
1213
using SharpConsoleUI.Layout;
@@ -16,7 +17,7 @@ namespace SharpConsoleUI.Builders;
1617
/// <summary>
1718
/// Fluent builder for markup controls
1819
/// </summary>
19-
public sealed class MarkupBuilder
20+
public sealed class MarkupBuilder : IControlBuilder<MarkupControl>
2021
{
2122
private readonly List<string> _lines = new();
2223
private HorizontalAlignment _alignment = HorizontalAlignment.Left;
@@ -302,6 +303,7 @@ public MarkupControl Build()
302303
ForegroundColor = _foregroundColor
303304
};
304305

306+
BindingHelper.ApplyDeferredBindings(this, markup);
305307
return markup;
306308
}
307309

SharpConsoleUI/Builders/MenuBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using SharpConsoleUI.Controls;
2+
using SharpConsoleUI.DataBinding;
23
using SharpConsoleUI.Events;
34

45
namespace SharpConsoleUI.Builders;
56

67
/// <summary>
78
/// Fluent builder for creating MenuControl instances with a clean, chainable API.
89
/// </summary>
9-
public class MenuBuilder
10+
public class MenuBuilder : IControlBuilder<MenuControl>
1011
{
1112
private MenuOrientation _orientation = MenuOrientation.Horizontal;
1213
private readonly List<MenuItem> _items = new();
@@ -319,6 +320,7 @@ public MenuControl Build()
319320
if (_itemHoveredHandler != null)
320321
menu.ItemHovered += _itemHoveredHandler;
321322

323+
BindingHelper.ApplyDeferredBindings(this, menu);
322324
return menu;
323325
}
324326

SharpConsoleUI/Builders/MultilineEditControlBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// -----------------------------------------------------------------------
88

99
using SharpConsoleUI.Controls;
10+
using SharpConsoleUI.DataBinding;
1011
using SharpConsoleUI.Events;
1112
using SharpConsoleUI.Extensions;
1213
using SharpConsoleUI.Layout;
@@ -16,7 +17,7 @@ namespace SharpConsoleUI.Builders;
1617
/// <summary>
1718
/// Fluent builder for multiline edit controls
1819
/// </summary>
19-
public sealed class MultilineEditControlBuilder
20+
public sealed class MultilineEditControlBuilder : IControlBuilder<MultilineEditControl>
2021
{
2122
private int _viewportHeight = Configuration.ControlDefaults.DefaultEditorViewportHeight;
2223
private string? _content;
@@ -812,6 +813,7 @@ public MultilineEditControl Build()
812813
};
813814
}
814815

816+
BindingHelper.ApplyDeferredBindings(this, control);
815817
return control;
816818
}
817819

0 commit comments

Comments
 (0)