1- using Microsoft . AspNetCore . Components . Rendering ;
2-
3- namespace TDesign ;
1+ namespace TDesign ;
42
53/// <summary>
64/// 用于收纳大量选项的信息录入类组件。
75/// </summary>
86/// <typeparam name="TValue">值的类型。</typeparam>
7+ [ ParentComponent ]
98public partial class TSelect < TValue >
109{
1110 /// <summary>
@@ -25,26 +24,43 @@ public partial class TSelect<TValue>
2524 /// <summary>
2625 /// Popup 组件的引用。
2726 /// </summary>
28- TPopup ? RefPopup { get ; set ; }
27+ internal TPopup ? RefPopup { get ; set ; }
2928
3029 /// <summary>
3130 /// 选中的标签的值。
3231 /// </summary>
33- string ? SelectedLabel { get ; set ; }
32+ internal string ? SelectedLabel { get ; set ; }
33+
34+ protected override async Task OnAfterRenderAsync ( bool firstRender )
35+ {
36+ await base . OnAfterRenderAsync ( firstRender ) ;
37+ if ( firstRender )
38+ {
39+ if ( Value is not null )
40+ {
41+ var initialSelectedOption = ChildComponents . OfType < TSelectOption < TValue > > ( ) . FirstOrDefault ( m => Value . Equals ( m . Value ) ) ;
42+
43+ if ( initialSelectedOption != null )
44+ {
45+ await SelectValue ( initialSelectedOption . Value , initialSelectedOption . Label ) ;
46+ await this . Refresh ( ) ;
47+ }
48+ }
49+ }
50+ }
51+
3452
3553 /// <summary>
3654 /// 选择指定的值。
3755 /// </summary>
3856 /// <param name="value">选中的值。</param>
3957 /// <param name="label">选中的文本。</param>
40- public Task ? SelectValue ( TValue ? value , string ? label )
58+ public async Task SelectValue ( TValue ? value , string ? label )
4159 {
4260 Value = value ;
43- ValueChanged . InvokeAsync ( value ) ;
44- OnValueSelected . InvokeAsync ( value ) ;
61+ await ValueChanged . InvokeAsync ( value ) ;
62+ await OnValueSelected . InvokeAsync ( value ) ;
4563 SelectedLabel = label ;
46- this . Refresh ( ) ;
47- return RefPopup ? . Hide ( ) ;
4864 }
4965
5066 protected override void BuildCssClass ( ICssClassBuilder builder )
@@ -67,7 +83,7 @@ public class TSelectOption<TValue> : TDesignComponentBase, IHasChildContent
6783 /// <summary>
6884 /// 级联 <see cref="TSelect{TValue}"/> 组件。
6985 /// </summary>
70- [ CascadingParameter ] protected TSelect < TValue > CascadingSelect { get ; set ; }
86+ [ CascadingParameter ] public TSelect < TValue > CascadingSelect { get ; set ; }
7187 /// <summary>
7288 /// 选项的值。
7389 /// </summary>
@@ -84,7 +100,7 @@ public class TSelectOption<TValue> : TDesignComponentBase, IHasChildContent
84100 /// <summary>
85101 /// 自定义选项的内容。
86102 /// </summary>
87- [ Parameter ] public RenderFragment ? ChildContent { get ; set ; }
103+ [ Parameter ] public RenderFragment ? ChildContent { get ; set ; }
88104
89105 /// <inheritdoc/>
90106 protected override void OnParametersSet ( )
@@ -114,12 +130,13 @@ protected override void BuildCssClass(ICssClassBuilder builder)
114130 /// <inheritdoc/>
115131 protected override void BuildAttributes ( IDictionary < string , object > attributes )
116132 {
117- attributes [ "onclick" ] = HtmlHelper . Instance . Callback ( ) . Create ( this , ( ) =>
133+ attributes [ "onclick" ] = HtmlHelper . Instance . Callback ( ) . Create ( this , async ( ) =>
118134 {
119- if ( ! Disabled )
135+ await CascadingSelect . SelectValue ( Value , Label ) ;
136+ if ( CascadingSelect . RefPopup is not null )
120137 {
121- CascadingSelect . SelectValue ( Value , Label ) ;
138+ await CascadingSelect . RefPopup . Hide ( ) ;
122139 }
123- } ) ;
140+ } , ! Disabled ) ;
124141 }
125142}
0 commit comments