Files
PropertyGrid/PROPERTYGRID_FIX.md
T
2026-08-10 14:46:18 +02:00

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: true if the type is an enum, false otherwise
  • 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: true for: 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: true if 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 IsReadOnly is true
  • Visibility controlled by TypeToBoolConverter checking for System.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.Value with 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

  1. Avalonia.PropertyGrid/Controls/PropertyGrid.axaml - Added editor Panel with conditional visibility
  2. Avalonia.PropertyGrid/Converters/PropertyGridConverters.cs - Added 3 new converters
  3. Examples/QuickStartExample/MainWindow.axaml - Reformatted for readability (earlier)

Status: ✅ FIXED - PropertyGrid now shows values and provides proper editors for all property types!