diff --git a/.editorconfig b/.editorconfig index e2bf2c2e74..6c77e15e63 100644 --- a/.editorconfig +++ b/.editorconfig @@ -63,6 +63,9 @@ dotnet_style_readonly_field = true:suggestion # Parameter preferences dotnet_code_quality_unused_parameters = all:suggestion +# Namespaces +dotnet_style_namespace_match_folder = false + #### C# Coding Conventions #### # var preferences diff --git a/Demos/Blazorise.Demo/Pages/Tests/DataGrid/GroupMultiplePage.razor b/Demos/Blazorise.Demo/Pages/Tests/DataGrid/GroupMultiplePage.razor index 5f4e0019bc..aefb28ff77 100644 --- a/Demos/Blazorise.Demo/Pages/Tests/DataGrid/GroupMultiplePage.razor +++ b/Demos/Blazorise.Demo/Pages/Tests/DataGrid/GroupMultiplePage.razor @@ -26,7 +26,7 @@ + @bind-Value="_selectedGroupKey"> @@ -41,7 +41,7 @@ + @bind-Value="_selectedNestedGroupKey"> diff --git a/Demos/Blazorise.Demo/Pages/Tests/DropdownListPage.razor b/Demos/Blazorise.Demo/Pages/Tests/DropdownListPage.razor index e152a36185..91aa3dd17e 100644 --- a/Demos/Blazorise.Demo/Pages/Tests/DropdownListPage.razor +++ b/Demos/Blazorise.Demo/Pages/Tests/DropdownListPage.razor @@ -4,7 +4,7 @@ - Dropdown List + Dropdown List: Single Value @@ -16,10 +16,9 @@ TextField="@(( item ) => item.Name)" ValueField="@((item) => item.Iso)" DisabledItem="@(item => item.Name == "Armenia")" - @bind-SelectedValue="@selectedDropValue" + @bind-Value="@selectedDropValue" Color="Color.Primary" - MaxMenuHeight="200px" - DropdownToggleSize="Size.Large"> + MaxMenuHeight="200px"> Select item @@ -32,23 +31,73 @@ + + - Dropdown List : Checkbox + Dropdown List: Generic List + + + + Select Value + Select items + + + + + + Selected values: @(selectedDropValues is not null ? string.Join( ',', selectedDropValues ) : "") + + + + + + + + + + Dropdown List: Array + + + + + + + + Select Value + + @@ -58,7 +107,7 @@ - Selected values: @(selectedDropValues is not null ? string.Join( ',', selectedDropValues ) : ""); + Selected values: @(selectedDropValues2 is not null ? string.Join( ',', selectedDropValues2 ) : "") @@ -72,7 +121,8 @@ public IEnumerable Countries; private string selectedDropValue { get; set; } = "AF"; - private IReadOnlyList selectedDropValues { get; set; } = new[] { "AM", "AF" }; + private IReadOnlyList selectedDropValues { get; set; } = new List { "AM", "AF" }; + private string[] selectedDropValues2 { get; set; } = new[] { "AM", "AF" }; protected override async Task OnInitializedAsync() { diff --git a/Demos/Blazorise.Demo/Pages/Tests/SelectListPage.razor b/Demos/Blazorise.Demo/Pages/Tests/SelectListPage.razor index b18d37724e..a622752896 100644 --- a/Demos/Blazorise.Demo/Pages/Tests/SelectListPage.razor +++ b/Demos/Blazorise.Demo/Pages/Tests/SelectListPage.razor @@ -16,7 +16,7 @@ Data="@Countries" TextField="@(( item ) => item.Name)" ValueField="@((item) => item.Iso)" - @bind-SelectedValue="@selectedListValue" + @bind-Value="@selectedListValue" DefaultItemText="Choose your country" /> @@ -38,12 +38,12 @@ Select Value diff --git a/Documentation/Blazorise.Docs/Models/Snippets.generated.cs b/Documentation/Blazorise.Docs/Models/Snippets.generated.cs index c31b615df0..28a4d6a04c 100644 --- a/Documentation/Blazorise.Docs/Models/Snippets.generated.cs +++ b/Documentation/Blazorise.Docs/Models/Snippets.generated.cs @@ -3807,7 +3807,7 @@ private static string GetColor( int number ) "; - public const string MultipleSelectExample = @" One Two Three @@ -9524,11 +9524,11 @@ protected override async Task OnInitializedAsync() } }"; - public const string DropdownListCheckboxExample = @""" Data=""@Countries"" TextField=""@((item)=>item.Name)"" ValueField=""@((item)=>item.Iso)"" - @bind-SelectedValues=""@selectedDropValues"" + @bind-Value=""@selectedDropValues"" SelectionMode=""DropdownListSelectionMode.Checkbox"" Color=""Color.Primary"" MaxMenuHeight=""200px""> @@ -9546,7 +9546,7 @@ Select item -@code{ +@code { [Inject] public CountryData CountryData { get; set; } public IEnumerable Countries; @@ -9558,14 +9558,13 @@ protected override async Task OnInitializedAsync() } private IReadOnlyList selectedDropValues { get; set; } = new[] { ""AM"", ""AF"" }; - }"; public const string DropdownListExample = @"item.Name)"" ValueField=""@((item)=>item.Iso)"" - @bind-SelectedValue=""@selectedDropValue"" + @bind-Value=""@selectedDropValue"" Color=""Color.Primary"" MaxMenuHeight=""200px""> Select item @@ -9580,7 +9579,7 @@ Select item -@code{ +@code { [Inject] public CountryData CountryData { get; set; } public IEnumerable Countries; @@ -9592,7 +9591,6 @@ protected override async Task OnInitializedAsync() } string selectedDropValue { get; set; } = ""CN""; - }"; public const string BasicFluentValidationExample = @"@using Blazorise.FluentValidation @@ -10357,7 +10355,7 @@ public async Task OnSave() Data=""@IndexedCountries"" TextField=""@((item)=>item.Name)"" ValueField=""@((item)=>item.Id)"" - @bind-SelectedValue=""@selectedListValue"" + @bind-Value=""@selectedListValue"" DefaultItemText=""Choose your country"" /> @code { @@ -10374,12 +10372,12 @@ public class MyCountryModel }"; public const string SelectListMultipleExample = @""" Data=""@IndexedFruits"" TextField=""@((item)=>item.Name)"" ValueField=""@((item)=>item.Id)"" Multiple - @bind-SelectedValues=""@selectedListValues"" + @bind-Value=""@selectedListValues"" DefaultItemText=""Choose your fruit"" /> @code { diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Code/MultipleSelectExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Code/MultipleSelectExampleCode.html index 8513de87b2..c97947c4ca 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Code/MultipleSelectExampleCode.html +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Code/MultipleSelectExampleCode.html @@ -1,6 +1,6 @@
-<Select TValue="int" Multiple>
+<Select TValue="int[]" Multiple>
     <SelectItem Value="1">One</SelectItem>
     <SelectItem Value="2">Two</SelectItem>
     <SelectItem Value="3">Three</SelectItem>
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Examples/MultipleSelectExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Examples/MultipleSelectExample.razor
index fb004103ba..4600b09d34 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Examples/MultipleSelectExample.razor
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/Examples/MultipleSelectExample.razor
@@ -1,6 +1,6 @@
 @namespace Blazorise.Docs.Docs.Examples
 
-
     One
     Two
     Three
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/SelectPage.razor b/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/SelectPage.razor
index 16076f2875..5c930137a0 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/SelectPage.razor
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Selects/SelectPage.razor
@@ -79,7 +79,7 @@
 
 
     
-        Add the Multiple attribute to allow more than one option to be selected.
+        By changing the enumerable type on the TValue, and by enabling the Multiple parameter, you will be able to select more than one option.
     
     
         
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListCheckboxExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListCheckboxExampleCode.html
index cf73f4b47e..deb12237d4 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListCheckboxExampleCode.html
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListCheckboxExampleCode.html
@@ -1,10 +1,10 @@
 
-<DropdownList TItem="Country" TValue="string"
+<DropdownList TItem="Country" TValue="IReadOnlyList<string>"
               Data="@Countries"
               TextField="@((item)=>item.Name)"
               ValueField="@((item)=>item.Iso)"
-              @bind-SelectedValues="@selectedDropValues"
+              @bind-Value="@selectedDropValues"
               SelectionMode="DropdownListSelectionMode.Checkbox"
               Color="Color.Primary"
               MaxMenuHeight="200px">
@@ -23,7 +23,7 @@
 </Field>
 
-@code{
+@code {
     [Inject]
     public CountryData CountryData { get; set; }
     public IEnumerable<Country> Countries;
@@ -35,7 +35,6 @@
     }
 
     private IReadOnlyList<string> selectedDropValues { get; set; } = new[] { "AM", "AF" };
-
 }
 
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListExampleCode.html index 0fc90d17ef..c2b587ecad 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListExampleCode.html +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Code/DropdownListExampleCode.html @@ -4,7 +4,7 @@ Data="@Countries" TextField="@((item)=>item.Name)" ValueField="@((item)=>item.Iso)" - @bind-SelectedValue="@selectedDropValue" + @bind-Value="@selectedDropValue" Color="Color.Primary" MaxMenuHeight="200px"> Select item @@ -20,7 +20,7 @@ </Field>
-@code{
+@code {
     [Inject]
     public CountryData CountryData { get; set; }
     public IEnumerable<Country> Countries;
@@ -32,7 +32,6 @@
     }
 
     string selectedDropValue { get; set; } = "CN";
-
 }
 
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListCheckboxExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListCheckboxExample.razor index 077859af23..ca790686d4 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListCheckboxExample.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListCheckboxExample.razor @@ -1,10 +1,10 @@ @namespace Blazorise.Docs.Docs.Examples - @@ -22,7 +22,7 @@ -@code{ +@code { [Inject] public CountryData CountryData { get; set; } public IEnumerable Countries; @@ -34,5 +34,4 @@ } private IReadOnlyList selectedDropValues { get; set; } = new[] { "AM", "AF" }; - } \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListExample.razor index 83c00008ac..74988815c0 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListExample.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DropdownList/Examples/DropdownListExample.razor @@ -4,7 +4,7 @@ Data="@Countries" TextField="@((item)=>item.Name)" ValueField="@((item)=>item.Iso)" - @bind-SelectedValue="@selectedDropValue" + @bind-Value="@selectedDropValue" Color="Color.Primary" MaxMenuHeight="200px"> Select item @@ -19,7 +19,7 @@ -@code{ +@code { [Inject] public CountryData CountryData { get; set; } public IEnumerable Countries; @@ -31,5 +31,4 @@ } string selectedDropValue { get; set; } = "CN"; - } \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListExampleCode.html index 3f960267b0..618a7cc155 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListExampleCode.html +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListExampleCode.html @@ -5,7 +5,7 @@ Data="@IndexedCountries" TextField="@((item)=>item.Name)" ValueField="@((item)=>item.Id)" - @bind-SelectedValue="@selectedListValue" + @bind-Value="@selectedListValue" DefaultItemText="Choose your country" />
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListMultipleExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListMultipleExampleCode.html
index 3ca1f22dfb..fe1b4839a2 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListMultipleExampleCode.html
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Code/SelectListMultipleExampleCode.html
@@ -1,12 +1,12 @@
 
 <SelectList TItem="MyFruitModel"
-            TValue="int"
+            TValue="IReadOnlyList<int>"
             Data="@IndexedFruits"
             TextField="@((item)=>item.Name)"
             ValueField="@((item)=>item.Id)"
             Multiple
-            @bind-SelectedValues="@selectedListValues"
+            @bind-Value="@selectedListValues"
             DefaultItemText="Choose your fruit" />
 
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListExample.razor
index 31dac6cfc8..3a0ae812b4 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListExample.razor
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListExample.razor
@@ -5,7 +5,7 @@
             Data="@IndexedCountries"
             TextField="@((item)=>item.Name)"
             ValueField="@((item)=>item.Id)"
-            @bind-SelectedValue="@selectedListValue"
+            @bind-Value="@selectedListValue"
             DefaultItemText="Choose your country" />
 
 @code {
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListMultipleExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListMultipleExample.razor
index e481021350..b219e06cf4 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListMultipleExample.razor
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/Examples/SelectListMultipleExample.razor
@@ -1,12 +1,12 @@
 @namespace Blazorise.Docs.Docs.Examples
 
 
 
 @code {
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/SelectListPage.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/SelectListPage.razor
index 39dab16d45..e8c610b37d 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/SelectListPage.razor
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SelectList/SelectListPage.razor
@@ -46,7 +46,7 @@
 
 
     
-        Just like with a regular Select component, add the Multiple parameter to allow more than one option to be selected. Also, bind the SelectedValues parameter.
+        Just like with a regular Select component, add the Multiple parameter to allow more than one option to be selected. Also, bind the Value parameter.
     
     
         
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Localization/Examples/ITextLocalizerServiceExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Localization/Examples/ITextLocalizerServiceExample.razor
index 0a69490d13..be65f2eeaf 100644
--- a/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Localization/Examples/ITextLocalizerServiceExample.razor
+++ b/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Localization/Examples/ITextLocalizerServiceExample.razor
@@ -12,7 +12,7 @@
                         Data="@LocalizationService.AvailableCultures"
                         TextField="@((item)=>item.IsNeutralCulture ? item.EnglishName : item.Parent.EnglishName)"
                         ValueField="@((item)=>item.Name)"
-                        @bind-SelectedValue="selectedCulture"
+                        @bind-Value="selectedCulture"
                         DefaultItemText="Choose your culture" />
         
         
diff --git a/Source/Blazorise/Base/BaseLinkComponent.cs b/Source/Blazorise/Base/BaseLinkComponent.cs
index 78d568950b..ac0542c7c5 100644
--- a/Source/Blazorise/Base/BaseLinkComponent.cs
+++ b/Source/Blazorise/Base/BaseLinkComponent.cs
@@ -48,7 +48,7 @@ protected override void OnParametersSet()
         if ( Attributes is not null && Attributes.TryGetValue( "href", out var href ) )
             To = $"{href}";
 
-        if ( To is not null && To.StartsWith( "#" ) )
+        if ( To is not null && To.StartsWith( '#' ) )
         {
             // If the href contains an anchor link we don't want the default click action to occur, but
             // rather take care of the click in our own method.
diff --git a/Source/Blazorise/Components/DatePicker/DatePicker.razor.cs b/Source/Blazorise/Components/DatePicker/DatePicker.razor.cs
index 4c0cd81191..709a045246 100644
--- a/Source/Blazorise/Components/DatePicker/DatePicker.razor.cs
+++ b/Source/Blazorise/Components/DatePicker/DatePicker.razor.cs
@@ -52,7 +52,7 @@ protected override async Task OnBeforeSetParametersAsync( ParameterView paramete
             var disabledChanged = parameters.TryGetValue( nameof( Disabled ), out bool paramDisabled ) && Disabled != paramDisabled;
             var readOnlyChanged = parameters.TryGetValue( nameof( ReadOnly ), out bool paramReadOnly ) && ReadOnly != paramReadOnly;
             var disabledDatesChanged = parameters.TryGetValue( nameof( DisabledDates ), out IEnumerable paramDisabledDates ) && !DisabledDates.AreEqual( paramDisabledDates );
-            var enabledDatesChanged = parameters.TryGetValue( nameof( EnabledDates ), out IEnumerable? paramEnabledDates ) && !EnabledDates.AreEqual( paramEnabledDates );
+            var enabledDatesChanged = parameters.TryGetValue( nameof( EnabledDates ), out IEnumerable paramEnabledDates ) && !EnabledDates.AreEqual( paramEnabledDates );
             var disabledDaysChanged = parameters.TryGetValue( nameof( DisabledDays ), out IEnumerable paramDisabledDays ) && !DisabledDays.AreEqual( paramDisabledDays );
             var selectionModeChanged = parameters.TryGetValue( nameof( SelectionMode ), out DateInputSelectionMode paramSelectionMode ) && !SelectionMode.IsEqual( paramSelectionMode );
             var inlineChanged = parameters.TryGetValue( nameof( Inline ), out bool paramInline ) && Inline != paramInline;
diff --git a/Source/Blazorise/Components/FileEdit/FileEdit.razor.cs b/Source/Blazorise/Components/FileEdit/FileEdit.razor.cs
index 3365fc399f..a89caaa84d 100644
--- a/Source/Blazorise/Components/FileEdit/FileEdit.razor.cs
+++ b/Source/Blazorise/Components/FileEdit/FileEdit.razor.cs
@@ -31,8 +31,6 @@ public partial class FileEdit : BaseInputComponent, IFileEdit,
     // taken from https://github.com/aspnet/AspNetCore/issues/11159
     private DotNetObjectReference dotNetObjectRef;
 
-    private IFileEntry[] files;
-
     #endregion
 
     #region Methods
diff --git a/Source/Blazorise/Components/InputMask/InputMask.razor.cs b/Source/Blazorise/Components/InputMask/InputMask.razor.cs
index e44db49712..d57c943b68 100644
--- a/Source/Blazorise/Components/InputMask/InputMask.razor.cs
+++ b/Source/Blazorise/Components/InputMask/InputMask.razor.cs
@@ -185,7 +185,7 @@ public Task NotifyCleared()
     [Parameter] public string InputFormat { get; set; }
 
     /// 
-    /// Defines the output format of the  when the  is used.
+    /// Defines the output format of the  when the  is used.
     /// 
     [Parameter] public string OutputFormat { get; set; }
 
diff --git a/Source/Blazorise/Components/NumericEdit/NumericEdit.razor.cs b/Source/Blazorise/Components/NumericEdit/NumericEdit.razor.cs
index 3a335904ea..7c6837cd86 100644
--- a/Source/Blazorise/Components/NumericEdit/NumericEdit.razor.cs
+++ b/Source/Blazorise/Components/NumericEdit/NumericEdit.razor.cs
@@ -14,7 +14,7 @@ namespace Blazorise;
 /// 
 /// An editor that displays a numeric value and allows a user to edit the value.
 /// 
-/// Data-type to be binded by the  property.
+/// Data-type to be binded by the  property.
 public partial class NumericEdit : BaseTextInput, IAsyncDisposable
 {
     #region Members
diff --git a/Source/Blazorise/Components/NumericPicker/NumericPicker.razor.cs b/Source/Blazorise/Components/NumericPicker/NumericPicker.razor.cs
index a9b589416b..c7c9946b40 100644
--- a/Source/Blazorise/Components/NumericPicker/NumericPicker.razor.cs
+++ b/Source/Blazorise/Components/NumericPicker/NumericPicker.razor.cs
@@ -17,7 +17,7 @@ namespace Blazorise;
 /// 
 /// An editor that displays a numeric value and allows a user to edit the value.
 /// 
-/// Data-type to be binded by the  property.
+/// Data-type to be binded by the  property.
 public partial class NumericPicker : BaseTextInput, INumericPicker, IAsyncDisposable
 {
     #region Members
diff --git a/Source/Blazorise/Components/Slider/Slider.razor.cs b/Source/Blazorise/Components/Slider/Slider.razor.cs
index 00158b5115..b815e303df 100644
--- a/Source/Blazorise/Components/Slider/Slider.razor.cs
+++ b/Source/Blazorise/Components/Slider/Slider.razor.cs
@@ -13,7 +13,7 @@ namespace Blazorise;
 /// 
 /// A slider to select a value from a given range.
 /// 
-/// Data-type to be binded by the  property.
+/// Data-type to be binded by the  property.
 public partial class Slider : BaseInputComponent
 {
     #region Members
@@ -39,8 +39,8 @@ protected override async Task OnBeforeSetParametersAsync( ParameterView paramete
 
         // This make sure we know that Min or Max parameters are defined and can be checked against the current value.
         // Without we cannot determine if Min or Max has a default value when TValue is non-nullable type.
-        minDefined = parameters.TryGetValue( nameof( Min ), out var min );
-        maxDefined = parameters.TryGetValue( nameof( Max ), out var max );
+        minDefined = parameters.TryGetValue( nameof( Min ), out var _ );
+        maxDefined = parameters.TryGetValue( nameof( Max ), out var _ );
     }
 
     /// 
diff --git a/Source/Blazorise/Licensing/BlazoriseLicenseProvider.cs b/Source/Blazorise/Licensing/BlazoriseLicenseProvider.cs
index 87a5f7de5b..7bf9a29223 100644
--- a/Source/Blazorise/Licensing/BlazoriseLicenseProvider.cs
+++ b/Source/Blazorise/Licensing/BlazoriseLicenseProvider.cs
@@ -15,10 +15,29 @@ public sealed class BlazoriseLicenseProvider
 {
     #region Members
 
+    /// 
+    /// Defines the default maximum rows for the unlicensed user.
+    /// 
     public const int DEFAULT_UNLICENSED_LIMIT_DATAGRID_MAX_ROWS = 1000;
+
+    /// 
+    /// Defines the default maximum rows for the unlicensed user.
+    /// 
     public const int DEFAULT_UNLICENSED_LIMIT_AUTOCOMPLETE_MAX_ROWS = 1000;
+
+    /// 
+    /// Defines the default maximum rows for the unlicensed user.
+    /// 
     public const int DEFAULT_UNLICENSED_LIMIT_CHARTS_MAX_ROWS = 10;
+
+    /// 
+    /// Defines the default maximum rows for the unlicensed user.
+    /// 
     public const int DEFAULT_UNLICENSED_LIMIT_LISTVIEW_MAX_ROWS = 1000;
+
+    /// 
+    /// Defines the default maximum rows for the unlicensed user.
+    /// 
     public const int DEFAULT_UNLICENSED_LIMIT_TREEVIEW_MAX_ROWS = 100;
 
     private static readonly Assembly CurrentAssembly = typeof( BlazoriseLicenseProvider ).Assembly;
diff --git a/Source/Blazorise/Utilities/Builders/ReverseStringBuilder.cs b/Source/Blazorise/Utilities/Builders/ReverseStringBuilder.cs
index 382e00694e..fd2a9977ff 100644
--- a/Source/Blazorise/Utilities/Builders/ReverseStringBuilder.cs
+++ b/Source/Blazorise/Utilities/Builders/ReverseStringBuilder.cs
@@ -122,7 +122,7 @@ private sealed class SequenceSegment : ReadOnlySequenceSegment, IDisposabl
     {
         private readonly char[] _array;
 
-        public SequenceSegment( char[] array, SequenceSegment? next = null )
+        public SequenceSegment( char[] array, SequenceSegment next = null )
         {
             _array = array;
             Memory = array;
diff --git a/Source/Blazorise/Utilities/Expressions/ExpressionFormatter.cs b/Source/Blazorise/Utilities/Expressions/ExpressionFormatter.cs
index 52ae716be3..9366c05958 100644
--- a/Source/Blazorise/Utilities/Expressions/ExpressionFormatter.cs
+++ b/Source/Blazorise/Utilities/Expressions/ExpressionFormatter.cs
@@ -52,7 +52,7 @@ public static string FormatLambda( LambdaExpression expression )
     /// The lambda expression to format.
     /// The prefix to prepend to the formatted string.
     /// The formatted string representation of the lambda expression with the prefix.
-    public static string FormatLambda( LambdaExpression expression, string? prefix = null )
+    public static string FormatLambda( LambdaExpression expression, string prefix = null )
     {
         var builder = new ReverseStringBuilder( stackalloc char[StackAllocBufferSize] );
         var node = expression.Body;
diff --git a/Source/Blazorise/Utilities/Formatters/Converters.cs b/Source/Blazorise/Utilities/Formatters/Converters.cs
index e61ad14e7e..7833f5bbf5 100644
--- a/Source/Blazorise/Utilities/Formatters/Converters.cs
+++ b/Source/Blazorise/Utilities/Formatters/Converters.cs
@@ -500,5 +500,65 @@ public static TValue ConvertCsvToReadOnlyList( string csv, string delimi
         }
     }
 
+    /// 
+    /// Converts a list of objects into a specified type of array or .
+    /// 
+    /// The target type, which must be either an array or a generic .
+    /// The list of objects to be converted.
+    /// 
+    /// A converted instance of the specified type (), either an array or a  populated with the elements from .
+    /// 
+    /// Thrown if the target type is not an array or a generic .
+    /// Thrown if an element in  cannot be cast to the target element type.
+    public static TValue ConvertListToReadOnlyList( List multipleValues )
+    {
+        var targetType = typeof( TValue );
+
+        Type elementType;
+        bool isArray = false;
+
+        if ( targetType.IsArray )
+        {
+            isArray = true;
+            elementType = targetType.GetElementType();
+        }
+        else if ( targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof( IReadOnlyList<> ) )
+        {
+            elementType = targetType.GetGenericArguments().Single();
+        }
+        else
+        {
+            throw new ArgumentException( "The target type must be either an array or a generic IReadOnlyList.", nameof( targetType ) );
+        }
+
+        if ( isArray )
+        {
+            var array = Array.CreateInstance( elementType, multipleValues.Count );
+            for ( int i = 0; i < multipleValues.Count; i++ )
+            {
+                array.SetValue( multipleValues[i], i );
+            }
+
+            return (TValue)(object)array;
+        }
+        else
+        {
+            var castedValues = typeof( Enumerable )
+                .GetMethod( "Cast" )
+                .MakeGenericMethod( elementType )
+                .Invoke( null, new object[] { multipleValues } );
+
+            var typedList = typeof( Enumerable )
+                .GetMethod( "ToList" )
+                .MakeGenericMethod( elementType )
+                .Invoke( null, new object[] { castedValues } );
+
+            var readOnlyListType = typeof( ReadOnlyCollection<> ).MakeGenericType( elementType );
+            var readOnlyList = Activator.CreateInstance( readOnlyListType, typedList );
+
+            return (TValue)readOnlyList;
+        }
+    }
+
     #endregion
 }
\ No newline at end of file
diff --git a/Source/Extensions/Blazorise.Components/DropdownList.razor b/Source/Extensions/Blazorise.Components/DropdownList.razor
index 05271fc652..4dbae3e85e 100644
--- a/Source/Extensions/Blazorise.Components/DropdownList.razor
+++ b/Source/Extensions/Blazorise.Components/DropdownList.razor
@@ -31,7 +31,7 @@
 
         @text
     };
 }
\ No newline at end of file
diff --git a/Source/Extensions/Blazorise.Components/DropdownList.razor.cs b/Source/Extensions/Blazorise.Components/DropdownList.razor.cs
index 7f9d866abf..f912818d50 100644
--- a/Source/Extensions/Blazorise.Components/DropdownList.razor.cs
+++ b/Source/Extensions/Blazorise.Components/DropdownList.razor.cs
@@ -1,5 +1,6 @@
 #region Using directives
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
@@ -29,44 +30,38 @@ public partial class DropdownList : ComponentBase
     /// 
     protected DropdownToggle dropdownToggleRef;
 
-    private List selectedValues;
-
     #endregion
 
     #region Methods
 
-    protected override void OnInitialized()
-    {
-        selectedValues = SelectedValues?.ToList();
-        base.OnInitialized();
-    }
-
-    public override async Task SetParametersAsync( ParameterView parameters )
+    protected Task HandleDropdownItemClicked( object value )
     {
-        var selectedValuesChanged = parameters.TryGetValue>( nameof( SelectedValues ), out var paramSelectedValues ) && !paramSelectedValues.AreEqual( SelectedValues );
-
-        await base.SetParametersAsync( parameters );
+        if ( Multiple )
+            return Task.CompletedTask;
 
-        if ( selectedValuesChanged )
-            selectedValues = paramSelectedValues?.ToList();
+        return ValueChanged.InvokeAsync( Converters.ChangeType( value ) );
     }
 
-    protected Task HandleDropdownItemClicked( object value )
+    protected Task HandleDropdownItemChecked( bool isChecked, object fieldValue )
     {
-        SelectedValue = Converters.ChangeType( value );
-        return SelectedValueChanged.InvokeAsync( SelectedValue );
-    }
+        if ( !Multiple )
+            return Task.CompletedTask;
 
-    protected Task HandleDropdownItemChecked( bool isChecked, TValue value )
-    {
-        selectedValues ??= new();
+        List selectedValues;
+
+        if ( Value is IEnumerable values )
+            selectedValues = values.Select( x => (object)x ).ToList();
+        else if ( Value is IEnumerable objects && Value is not string )
+            selectedValues = objects.Cast().ToList();
+        else
+            selectedValues = new List();
 
         if ( isChecked )
-            selectedValues.Add( value );
+            selectedValues.Add( fieldValue );
         else
-            selectedValues.Remove( value );
+            selectedValues.Remove( fieldValue );
 
-        return SelectedValuesChanged.InvokeAsync( selectedValues );
+        return ValueChanged.InvokeAsync( Converters.ConvertListToReadOnlyList( selectedValues ) );
     }
 
     /// 
@@ -87,7 +82,7 @@ private string GetItemText( TItem item )
         return TextField.Invoke( item );
     }
 
-    private TValue GetItemValue( TItem item )
+    private object GetItemValue( TItem item )
     {
         if ( ValueField is null )
             return default;
@@ -103,15 +98,53 @@ private bool GetItemDisabled( TItem item )
         return DisabledItem.Invoke( item );
     }
 
+    /// 
+    /// Check if the internal value is same as the new value.
+    /// 
+    /// Value to check against the internal value.
+    /// True if the internal value matched the supplied value.
+    protected bool IsSameAsInternalValue( TValue value )
+    {
+        if ( value is IEnumerable values1 && Value is IEnumerable values2 )
+        {
+            return values1.AreEqual( values2 );
+        }
+        else if ( value is IEnumerable objects1 && Value is IEnumerable objects2 )
+        {
+            return objects1.AreEqual( objects2 );
+        }
+
+        return value.IsEqual( Value );
+    }
+
     #endregion
 
     #region Properties
 
+    /// 
+    /// Indicates if the multiple items can be selected.
+    /// 
+    protected bool Multiple => SelectionMode == DropdownListSelectionMode.Checkbox;
+
     /// 
     /// Whether the value is currently selected.
     /// 
-    protected bool IsSelected( TValue value )
-        => selectedValues?.Any( x => x.Equals( value ) ) ?? false;
+    protected bool IsSelected( object value )
+    {
+        if ( Value is null )
+            return false;
+
+        if ( Value is IEnumerable values )
+        {
+            return values.Any( x => x.IsEqual( value ) );
+        }
+        else if ( Value is IEnumerable objects && Value is not string )
+        {
+            return objects.Cast().Any( x => x.IsEqual( value ) );
+        }
+
+        return Value.IsEqual( value );
+    }
 
     /// 
     /// Gets or sets the dropdown element id.
@@ -156,17 +189,17 @@ protected bool IsSelected( TValue value )
     /// 
     /// Method used to get the value field from the supplied data source.
     /// 
-    [Parameter] public Func ValueField { get; set; }
+    [Parameter] public Func ValueField { get; set; }
 
     /// 
     /// Currently selected item value.
     /// 
-    [Parameter] public TValue SelectedValue { get; set; }
+    [Parameter] public TValue Value { get; set; }
 
     /// 
     /// Occurs after the selected value has changed.
     /// 
-    [Parameter] public EventCallback SelectedValueChanged { get; set; }
+    [Parameter] public EventCallback ValueChanged { get; set; }
 
     /// 
     /// Custom classname for dropdown element.
@@ -209,16 +242,6 @@ protected bool IsSelected( TValue value )
     /// 
     [Parameter] public DropdownListSelectionMode SelectionMode { get; set; } = DropdownListSelectionMode.Default;
 
-    /// 
-    /// Currently selected item values.
-    /// 
-    [Parameter] public IReadOnlyList SelectedValues { get; set; }
-
-    /// 
-    /// Occurs after the selected item values have changed.
-    /// 
-    [Parameter] public EventCallback> SelectedValuesChanged { get; set; }
-
     /// 
     /// Method used to get the disabled items from the supplied data source.
     /// 
diff --git a/Source/Extensions/Blazorise.Components/SelectList.razor b/Source/Extensions/Blazorise.Components/SelectList.razor
index 1f4ef1c7a2..19edc32ad1 100644
--- a/Source/Extensions/Blazorise.Components/SelectList.razor
+++ b/Source/Extensions/Blazorise.Components/SelectList.razor
@@ -1,6 +1,6 @@
 @typeparam TItem
 @typeparam TValue
-
     
         @if ( DefaultItemText != null )
         {
diff --git a/Source/Extensions/Blazorise.Components/SelectList.razor.cs b/Source/Extensions/Blazorise.Components/SelectList.razor.cs
index d4b9a934d5..0680643da4 100644
--- a/Source/Extensions/Blazorise.Components/SelectList.razor.cs
+++ b/Source/Extensions/Blazorise.Components/SelectList.razor.cs
@@ -37,13 +37,6 @@ protected override void OnInitialized()
         base.OnInitialized();
     }
 
-    protected Task HandleSelectedValueChanged( TValue value )
-    {
-        SelectedValue = value;
-
-        return SelectedValueChanged.InvokeAsync( value );
-    }
-
     /// 
     /// Sets focus on the input element, if it can be focused.
     /// 
@@ -86,7 +79,7 @@ public Task Focus( bool scrollToElement = true )
     /// 
     /// Method used to get the value field from the supplied data source.
     /// 
-    [Parameter] public Func ValueField { get; set; }
+    [Parameter] public Func ValueField { get; set; }
 
     /// 
     /// Method used to determine if an item should be disabled.
@@ -96,32 +89,17 @@ public Task Focus( bool scrollToElement = true )
     /// 
     /// Currently selected item value.
     /// 
-    [Parameter] public TValue SelectedValue { get; set; }
-
-    /// 
-    /// Gets or sets the multiple selected item values.
-    /// 
-    [Parameter] public IReadOnlyList SelectedValues { get; set; }
+    [Parameter] public TValue Value { get; set; }
 
     /// 
     /// Occurs after the selected value has changed.
     /// 
-    [Parameter] public EventCallback SelectedValueChanged { get; set; }
-
-    /// 
-    /// Occurs when the selected items value has changed (only when ==true).
-    /// 
-    [Parameter] public EventCallback> SelectedValuesChanged { get; set; }
-
-    /// 
-    /// Gets or sets an expression that identifies the selected value.
-    /// 
-    [Parameter] public Expression> SelectedValueExpression { get; set; }
+    [Parameter] public EventCallback ValueChanged { get; set; }
 
     /// 
     /// Gets or sets an expression that identifies the selected value.
     /// 
-    [Parameter] public Expression>> SelectedValuesExpression { get; set; }
+    [Parameter] public Expression> ValueExpression { get; set; }
 
     /// 
     /// Display text of the default select item.
@@ -131,7 +109,7 @@ public Task Focus( bool scrollToElement = true )
     /// 
     /// Value of the default select item.
     /// 
-    [Parameter] public TValue DefaultItemValue { get; set; }
+    [Parameter] public object DefaultItemValue { get; set; }
 
     /// 
     /// If true, disables the default item.