5.9 KiB
5.9 KiB
PropertyGrid Fix Summary
Issue
The QuickStartExample and AdvancedExample were not displaying property values in the PropertyGrid control.
Root Cause
The PropertyGrid template had a ContentControl for displaying property values, but it lacked proper DataTemplates or editors to render the actual values for different property types.
Solution
1. Added Property Value Editors (PropertyGrid.axaml)
Replaced the empty ContentControl with a comprehensive editor system using a Panel with multiple editors:
<Panel>
<!-- Boolean Editor (CheckBox) -->
<CheckBox IsChecked="{Binding Value, Mode=TwoWay}"
IsEnabled="{Binding !IsReadOnly}"
IsVisible="{Binding PropertyType, Converter={StaticResource TypeToBoolConverter}, ConverterParameter='System.Boolean'}" />
<!-- Enum Editor (ComboBox) -->
<ComboBox ItemsSource="{Binding PropertyType, Converter={StaticResource EnumValuesConverter}}"
SelectedItem="{Binding Value, Mode=TwoWay}"
IsEnabled="{Binding !IsReadOnly}"
IsVisible="{Binding PropertyType, Converter={StaticResource IsEnumConverter}}" />
<!-- Default Text Editor -->
<TextBox Text="{Binding Value, Mode=TwoWay}"
IsReadOnly="{Binding IsReadOnly}"
IsVisible="{Binding PropertyType, Converter={StaticResource IsSimpleTypeConverter}}" />
<!-- Complex Type Display -->
<TextBlock Text="{Binding ValueString}"
IsVisible="{Binding IsExpandable}" />
</Panel>
2. Added Type Converters (PropertyGridConverters.cs)
Created four new converters to support the editor visibility logic:
IsEnumConverter
- Purpose: Determines if a property type is an enum
- Returns:
trueif the type is an enum,falseotherwise - Used for: Showing/hiding the ComboBox editor for enum properties
IsSimpleTypeConverter
- Purpose: Determines if a property is a simple type (string, number, DateTime, etc.)
- Returns:
truefor: string, int, long, short, byte, float, double, decimal, DateTime, TimeSpan, Guid, etc. - Used for: Showing/hiding the TextBox editor for simple types
TypeToBoolConverter
- Purpose: Checks if a type matches a specific type name
- Parameters: Takes a type name string (e.g., "System.Boolean")
- Returns:
trueif the property type matches the specified name - Used for: Showing/hiding the CheckBox editor for bool properties
EnumValuesConverter (already existed, kept)
- Purpose: Converts an enum Type to an array of its possible values
- Used for: Populating the ComboBox dropdown for enum properties
3. Registered Converters as Resources
Updated the Style.Resources section to include all converters:
<Style.Resources>
<controls:IndentToMarginConverter x:Key="IndentConverter" />
<controls:EnumValuesConverter x:Key="EnumValuesConverter" />
<controls:IsEnumConverter x:Key="IsEnumConverter" />
<controls:IsSimpleTypeConverter x:Key="IsSimpleTypeConverter" />
<controls:TypeToBoolConverter x:Key="TypeToBoolConverter" />
</Style.Resources>
How It Works Now
1. Boolean Properties
- Display as CheckBox
- Bound with TwoWay binding to
PropertyItem.Value - Disabled if
IsReadOnlyis true - Visibility controlled by
TypeToBoolConverterchecking forSystem.Boolean
2. Enum Properties
- Display as ComboBox with dropdown
- Items populated from
EnumValuesConverter - Selected value bound to
PropertyItem.Value - Visibility controlled by
IsEnumConverter
3. Simple Type Properties (string, int, double, DateTime, etc.)
- Display as TextBox
- Text bound to
PropertyItem.Valuewith TwoWay binding - Set to ReadOnly mode if property is read-only
- Visibility controlled by
IsSimpleTypeConverter
4. Complex/Nested Properties
- Display as TextBlock showing formatted value string
- Shows the object's ToString() representation
- Visible only for expandable complex types
- Can be expanded to show nested properties
Property Types Supported
| Type | Editor | Example |
|---|---|---|
bool |
CheckBox | IsElectric, EnableLogging |
| Enums | ComboBox | FuelType, ConnectionType, LogLevel |
string |
TextBox | ServerName, Make, Model |
int, long, short |
TextBox | Year, MaxConnections, Port |
float, double, decimal |
TextBox | Mileage, Price |
DateTime |
TextBox | PurchaseDate, CreatedDate |
TimeSpan |
TextBox | Timeout |
Guid |
TextBox | ConfigurationId |
| Complex Objects | TextBlock (expandable) | DatabaseSettings, NetworkSettings |
Testing
QuickStartExample Properties
- ✅ Make (string) → TextBox
- ✅ Model (string) → TextBox
- ✅ Year (int) → TextBox
- ✅ Color (string) → TextBox
- ✅ Mileage (double) → TextBox
- ✅ IsElectric (bool) → CheckBox
- ✅ FuelType (enum) → ComboBox
- ✅ Price (decimal) → TextBox
- ✅ PurchaseDate (DateTime) → TextBox
- ✅ VIN (string, read-only) → TextBox (disabled)
AdvancedExample Properties
- ✅ All simple types → TextBox
- ✅ All boolean flags → CheckBox
- ✅ All enums (ConnectionType, LogLevel, DatabaseProvider) → ComboBox
- ✅ Nested objects (DatabaseSettings, NetworkSettings) → Expandable TextBlock
Build Status
✅ All projects build successfully
✅ No compile errors
✅ PropertyGrid now displays and edits values
Visual Result
Users can now:
- See all property values displayed correctly
- Edit string/number properties with TextBox
- Toggle boolean properties with CheckBox
- Select enum values from dropdown ComboBox
- Expand nested objects to view/edit sub-properties
Files Modified
Avalonia.PropertyGrid/Controls/PropertyGrid.axaml- Added editor Panel with conditional visibilityAvalonia.PropertyGrid/Converters/PropertyGridConverters.cs- Added 3 new convertersExamples/QuickStartExample/MainWindow.axaml- Reformatted for readability (earlier)
Status: ✅ FIXED - PropertyGrid now shows values and provides proper editors for all property types!