Skip to content

Commit f23da2e

Browse files
Copilotcsharpfritz
andcommitted
Add Sender property to EventArgs classes and update components
- Added Sender property to all custom EventArgs classes (CommandEventArgs, DataListItemEventArgs, AdCreatedEventArgs, ListViewItemEventArgs, FormView*EventArgs, Login*EventArgs) - Updated all components to populate Sender property when raising events - Added tests to verify Sender property is correctly populated - All 434 tests passing (430 original + 4 new Sender property tests) Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>
1 parent 7f484dc commit f23da2e

21 files changed

Lines changed: 196 additions & 18 deletions
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
@using Moq
2+
@using Microsoft.AspNetCore.Http
3+
@using Microsoft.AspNetCore.Routing
4+
@inherits BunitContext
5+
6+
@code {
7+
8+
private object capturedSender = null;
9+
private string commandName = string.Empty;
10+
private object commandArg = null;
11+
12+
void OnCommand(CommandEventArgs args)
13+
{
14+
capturedSender = args.Sender;
15+
commandName = args.CommandName;
16+
commandArg = args.CommandArgument;
17+
}
18+
19+
[Fact]
20+
public void Button_Command_PopulatesSenderProperty()
21+
{
22+
// Arrange
23+
Services.AddSingleton<LinkGenerator>(new Mock<LinkGenerator>().Object);
24+
Services.AddSingleton<IHttpContextAccessor>(new Mock<IHttpContextAccessor>().Object);
25+
capturedSender = null;
26+
var cut = Render(@<Button CommandName="TestCommand" CommandArgument="@("TestArg")" OnCommand="OnCommand">Test Button</Button>);
27+
28+
// Act
29+
cut.Find("button").Click();
30+
31+
// Assert
32+
capturedSender.ShouldNotBeNull();
33+
capturedSender.ShouldBeOfType<Button>();
34+
commandName.ShouldBe("TestCommand");
35+
commandArg.ShouldBe("TestArg");
36+
}
37+
38+
[Fact]
39+
public void Button_Command_SenderIsTheButtonInstance()
40+
{
41+
// Arrange
42+
Services.AddSingleton<LinkGenerator>(new Mock<LinkGenerator>().Object);
43+
Services.AddSingleton<IHttpContextAccessor>(new Mock<IHttpContextAccessor>().Object);
44+
Button buttonRef = null;
45+
capturedSender = null;
46+
var cut = Render(@<Button @ref="buttonRef" CommandName="TestCmd" CommandArgument="@("Arg")" OnCommand="OnCommand" Text="Click" />);
47+
var buttonInstance = cut.FindComponent<Button>().Instance;
48+
49+
// Act
50+
cut.Find("button").Click();
51+
52+
// Assert
53+
capturedSender.ShouldBe(buttonInstance);
54+
}
55+
56+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
@using SharedSampleObjects.Models
2+
@using Moq
3+
@using Microsoft.AspNetCore.Http
4+
@using Microsoft.AspNetCore.Routing
5+
@inherits BunitContext
6+
7+
@code {
8+
9+
private object capturedSender = null;
10+
private object capturedItem = null;
11+
12+
void OnItemDataBound(DataListItemEventArgs args)
13+
{
14+
capturedSender = args.Sender;
15+
capturedItem = args.Item;
16+
}
17+
18+
[Fact]
19+
public void DataList_ItemDataBound_PopulatesSenderProperty()
20+
{
21+
// Arrange
22+
Services.AddSingleton<LinkGenerator>(new Mock<LinkGenerator>().Object);
23+
Services.AddSingleton<IHttpContextAccessor>(new Mock<IHttpContextAccessor>().Object);
24+
capturedSender = null;
25+
capturedItem = null;
26+
var widgets = Widget.SimpleWidgetList;
27+
28+
var cut = Render(@<DataList Items="widgets" OnItemDataBound="OnItemDataBound">
29+
<ItemTemplate>
30+
<span>@context.Name</span>
31+
</ItemTemplate>
32+
</DataList>);
33+
34+
// Assert - Sender should be set for each item
35+
capturedSender.ShouldNotBeNull();
36+
capturedSender.ShouldBeOfType<DataList<Widget>>();
37+
capturedItem.ShouldNotBeNull();
38+
}
39+
40+
[Fact]
41+
public void DataList_ItemDataBound_SenderIsDataListInstance()
42+
{
43+
// Arrange
44+
Services.AddSingleton<LinkGenerator>(new Mock<LinkGenerator>().Object);
45+
Services.AddSingleton<IHttpContextAccessor>(new Mock<IHttpContextAccessor>().Object);
46+
capturedSender = null;
47+
var widgets = new[] { new Widget { Name = "Test Widget" } };
48+
49+
var cut = Render(@<DataList Items="widgets" OnItemDataBound="OnItemDataBound">
50+
<ItemTemplate>
51+
<span>@context.Name</span>
52+
</ItemTemplate>
53+
</DataList>);
54+
55+
var dataListInstance = cut.FindComponent<DataList<Widget>>().Instance;
56+
57+
// Assert
58+
capturedSender.ShouldBe(dataListInstance);
59+
}
60+
61+
}

src/BlazorWebFormsComponents/AdCreatedEventArgs.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,10 @@ public AdCreatedEventArgs(IDictionary adProperties)
1717
public string ImageUrl { get; set; }
1818

1919
public string NavigateUrl { get; set; }
20+
21+
/// <summary>
22+
/// The component that raised this event
23+
/// </summary>
24+
public object Sender { get; set; }
2025
}
2126
}

src/BlazorWebFormsComponents/AdRotator.razor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ internal Advertisment GetActiveAdvertisment()
8080
{
8181
AlternateText = advertisment.AlternateText,
8282
ImageUrl = advertisment.ImageUrl,
83-
NavigateUrl = advertisment.NavigateUrl
83+
NavigateUrl = advertisment.NavigateUrl,
84+
Sender = this
8485
};
8586

8687
AdCreated(adArgs);

src/BlazorWebFormsComponents/ButtonBaseComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ protected void Click()
3434
{
3535
if (!string.IsNullOrEmpty(CommandName))
3636
{
37-
var args = new CommandEventArgs(CommandName, CommandArgument);
37+
var args = new CommandEventArgs(CommandName, CommandArgument) { Sender = this };
3838
OnCommand.InvokeAsync(args);
3939
OnBubbledEvent(this, args);
4040
}

src/BlazorWebFormsComponents/CommandEventArgs.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public CommandEventArgs(CommandEventArgs args)
2626

2727
public object CommandArgument { get; set; }
2828

29+
/// <summary>
30+
/// The component that raised this event
31+
/// </summary>
32+
public object Sender { get; set; }
33+
2934
}
3035

3136
}

src/BlazorWebFormsComponents/DataList.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
<td style="@(even ? ItemStyle : AlternatingItemTemplate == null ? ItemStyle : AlternatingItemStyle)">@(even ? ItemTemplate(item) : AlternatingItemTemplate == null ? ItemTemplate(item) : AlternatingItemTemplate(item))</td>
7878
</CascadingValue>
7979

80-
ItemDataBound(new DataListItemEventArgs(item));
80+
ItemDataBound(new DataListItemEventArgs(item) { Sender = this });
8181

8282
idx++;
8383
first = false;
@@ -123,7 +123,7 @@
123123
}
124124
<span style="@(even ? ItemStyle : AlternatingItemTemplate == null ? ItemStyle : AlternatingItemStyle)">@(even ? ItemTemplate(item) : AlternatingItemTemplate == null ? ItemTemplate(item) : AlternatingItemTemplate(item))</span>
125125
</CascadingValue>
126-
ItemDataBound(new DataListItemEventArgs(item));
126+
ItemDataBound(new DataListItemEventArgs(item) { Sender = this });
127127
first = false;
128128
idx++;
129129
} while ((idx - 1) % RepeatColumns != 0 && idx <= IndexedItems.Count());

src/BlazorWebFormsComponents/DataListItemEventArgs.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,10 @@ public DataListItemEventArgs(object item)
1010
}
1111

1212
public object Item { get; }
13+
14+
/// <summary>
15+
/// The component that raised this event
16+
/// </summary>
17+
public object Sender { get; set; }
1318
}
1419
}

src/BlazorWebFormsComponents/FormView.razor.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,35 +93,35 @@ private void HandleCommandArgs(CommandEventArgs args)
9393
switch (args.CommandName.ToLowerInvariant())
9494
{
9595
case "cancel":
96-
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = DefaultMode }).GetAwaiter().GetResult();
96+
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = DefaultMode, Sender = this }).GetAwaiter().GetResult();
9797
CurrentMode = DefaultMode;
9898
break;
9999
case "edit":
100-
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = FormViewMode.Edit }).GetAwaiter().GetResult();
100+
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = FormViewMode.Edit, Sender = this }).GetAwaiter().GetResult();
101101
CurrentMode = FormViewMode.Edit;
102102
break;
103103
case "delete":
104104
Exception caughtException = null;
105105
try {
106-
OnItemDeleting.InvokeAsync(new FormViewDeleteEventArgs(Position)).GetAwaiter().GetResult();
106+
OnItemDeleting.InvokeAsync(new FormViewDeleteEventArgs(Position) { Sender = this }).GetAwaiter().GetResult();
107107
} catch (Exception ex) {
108108
caughtException = ex;
109109
}
110110
// do we do the deletion?
111-
OnItemDeleted.InvokeAsync(new FormViewDeletedEventArgs(Position, caughtException)).GetAwaiter().GetResult();
111+
OnItemDeleted.InvokeAsync(new FormViewDeletedEventArgs(Position, caughtException) { Sender = this }).GetAwaiter().GetResult();
112112
CurrentMode = DefaultMode;
113113
Position = (Position == 0) ? 0 : Position - 1;
114114
break;
115115
case "insert":
116-
OnItemInserting.InvokeAsync(new FormViewInsertEventArgs("insert") { }).GetAwaiter().GetResult();
117-
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = FormViewMode.Insert }).GetAwaiter().GetResult();
118-
OnItemInserted.InvokeAsync(new FormViewInsertEventArgs("insert") { }).GetAwaiter().GetResult();
116+
OnItemInserting.InvokeAsync(new FormViewInsertEventArgs("insert") { Sender = this }).GetAwaiter().GetResult();
117+
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = FormViewMode.Insert, Sender = this }).GetAwaiter().GetResult();
118+
OnItemInserted.InvokeAsync(new FormViewInsertEventArgs("insert") { Sender = this }).GetAwaiter().GetResult();
119119
CurrentMode = FormViewMode.Insert;
120120
break;
121121
case "update":
122-
OnItemUpdating.InvokeAsync(new FormViewUpdateEventArgs("update")).GetAwaiter().GetResult();
123-
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = DefaultMode }).GetAwaiter().GetResult();
124-
OnItemUpdated.InvokeAsync(new FormViewUpdatedEventArgs(0, null)).GetAwaiter().GetResult();
122+
OnItemUpdating.InvokeAsync(new FormViewUpdateEventArgs("update") { Sender = this }).GetAwaiter().GetResult();
123+
ModeChanging.InvokeAsync(new FormViewModeEventArgs() { NewMode = DefaultMode, Sender = this }).GetAwaiter().GetResult();
124+
OnItemUpdated.InvokeAsync(new FormViewUpdatedEventArgs(0, null) { Sender = this }).GetAwaiter().GetResult();
125125
CurrentMode = DefaultMode;
126126
break;
127127

src/BlazorWebFormsComponents/FormViewDeleteEventArgs.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ public FormViewDeleteEventArgs(int rowIndex)
1717

1818
public IOrderedDictionary Values { get; internal set; }
1919

20+
/// <summary>
21+
/// The component that raised this event
22+
/// </summary>
23+
public object Sender { get; set; }
24+
2025
}
2126

2227
}

0 commit comments

Comments
 (0)