diff --git a/OpenMaui.Controls.Linux.csproj b/OpenMaui.Controls.Linux.csproj
index 7ae1bf9..c3d5c70 100644
--- a/OpenMaui.Controls.Linux.csproj
+++ b/OpenMaui.Controls.Linux.csproj
@@ -9,10 +9,12 @@
true
true
$(NoWarn);CS0108;CS1591;CS0618
+ false
+ false
OpenMaui.Controls.Linux
- 1.0.0-preview.4
+ 1.0.0-rc.1
MarketAlly LLC, David H. Friedel Jr.
MarketAlly LLC
OpenMaui Linux Controls
@@ -23,7 +25,7 @@
https://git.marketally.com/open-maui/maui-linux.git
git
maui;linux;desktop;skia;gui;cross-platform;dotnet;x11;wayland;openmaui
- Preview 4: Fixed handler rendering for layouts, text wrapping, and scrollbar measurement issues.
+ RC1: Full XAML support with BindableProperty for all controls, Visual State Manager integration, data binding, and XAML styles.
README.md
icon.png
false
diff --git a/README.md b/README.md
index 00e3ac5..59a7eb6 100644
--- a/README.md
+++ b/README.md
@@ -210,6 +210,52 @@ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) f
└─────────────────────────────────────────────────┘
```
+## Styling and Data Binding
+
+OpenMaui supports the full MAUI styling and data binding infrastructure:
+
+### XAML Styles
+```xml
+
+
+ #5C6BC0
+
+
+
+```
+
+### Data Binding
+```xml
+
+
+
+```
+
+### Visual State Manager
+All interactive controls support VSM states: Normal, PointerOver, Pressed, Focused, Disabled.
+
+```xml
+
+```
+
## Roadmap
- [x] Core control library (35+ controls)
@@ -219,6 +265,10 @@ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) f
- [x] High DPI support
- [x] Drag and drop
- [x] Global hotkeys
+- [x] BindableProperty for all controls
+- [x] Visual State Manager integration
+- [x] XAML styles and StaticResource
+- [x] Data binding (OneWay, TwoWay, IValueConverter)
- [ ] Complete Wayland support
- [ ] Hardware video acceleration
- [ ] GTK4 interop layer
diff --git a/Views/SkiaCollectionView.cs b/Views/SkiaCollectionView.cs
index 94f06e9..9860d79 100644
--- a/Views/SkiaCollectionView.cs
+++ b/Views/SkiaCollectionView.cs
@@ -31,22 +31,147 @@ public enum ItemsLayoutOrientation
///
public class SkiaCollectionView : SkiaItemsView
{
- private SkiaSelectionMode _selectionMode = SkiaSelectionMode.Single;
- private object? _selectedItem;
+ #region BindableProperties
+
+ ///
+ /// Bindable property for SelectionMode.
+ ///
+ public static readonly BindableProperty SelectionModeProperty =
+ BindableProperty.Create(
+ nameof(SelectionMode),
+ typeof(SkiaSelectionMode),
+ typeof(SkiaCollectionView),
+ SkiaSelectionMode.Single,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).OnSelectionModeChanged());
+
+ ///
+ /// Bindable property for SelectedItem.
+ ///
+ public static readonly BindableProperty SelectedItemProperty =
+ BindableProperty.Create(
+ nameof(SelectedItem),
+ typeof(object),
+ typeof(SkiaCollectionView),
+ null,
+ BindingMode.TwoWay,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).OnSelectedItemChanged(n));
+
+ ///
+ /// Bindable property for Orientation.
+ ///
+ public static readonly BindableProperty OrientationProperty =
+ BindableProperty.Create(
+ nameof(Orientation),
+ typeof(ItemsLayoutOrientation),
+ typeof(SkiaCollectionView),
+ ItemsLayoutOrientation.Vertical,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for SpanCount.
+ ///
+ public static readonly BindableProperty SpanCountProperty =
+ BindableProperty.Create(
+ nameof(SpanCount),
+ typeof(int),
+ typeof(SkiaCollectionView),
+ 1,
+ coerceValue: (b, v) => Math.Max(1, (int)v),
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for GridItemWidth.
+ ///
+ public static readonly BindableProperty GridItemWidthProperty =
+ BindableProperty.Create(
+ nameof(GridItemWidth),
+ typeof(float),
+ typeof(SkiaCollectionView),
+ 100f,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for Header.
+ ///
+ public static readonly BindableProperty HeaderProperty =
+ BindableProperty.Create(
+ nameof(Header),
+ typeof(object),
+ typeof(SkiaCollectionView),
+ null,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).OnHeaderChanged(n));
+
+ ///
+ /// Bindable property for Footer.
+ ///
+ public static readonly BindableProperty FooterProperty =
+ BindableProperty.Create(
+ nameof(Footer),
+ typeof(object),
+ typeof(SkiaCollectionView),
+ null,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).OnFooterChanged(n));
+
+ ///
+ /// Bindable property for HeaderHeight.
+ ///
+ public static readonly BindableProperty HeaderHeightProperty =
+ BindableProperty.Create(
+ nameof(HeaderHeight),
+ typeof(float),
+ typeof(SkiaCollectionView),
+ 0f,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for FooterHeight.
+ ///
+ public static readonly BindableProperty FooterHeightProperty =
+ BindableProperty.Create(
+ nameof(FooterHeight),
+ typeof(float),
+ typeof(SkiaCollectionView),
+ 0f,
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for SelectionColor.
+ ///
+ public static readonly BindableProperty SelectionColorProperty =
+ BindableProperty.Create(
+ nameof(SelectionColor),
+ typeof(SKColor),
+ typeof(SkiaCollectionView),
+ new SKColor(0x21, 0x96, 0xF3, 0x59),
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for HeaderBackgroundColor.
+ ///
+ public static readonly BindableProperty HeaderBackgroundColorProperty =
+ BindableProperty.Create(
+ nameof(HeaderBackgroundColor),
+ typeof(SKColor),
+ typeof(SkiaCollectionView),
+ new SKColor(0xF5, 0xF5, 0xF5),
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ ///
+ /// Bindable property for FooterBackgroundColor.
+ ///
+ public static readonly BindableProperty FooterBackgroundColorProperty =
+ BindableProperty.Create(
+ nameof(FooterBackgroundColor),
+ typeof(SKColor),
+ typeof(SkiaCollectionView),
+ new SKColor(0xF5, 0xF5, 0xF5),
+ propertyChanged: (b, o, n) => ((SkiaCollectionView)b).Invalidate());
+
+ #endregion
+
private List