Skip to content

Compiled Binding support for Avalonia #2

Description

@laolarou726

目前,在 Avalonia 11 开始。Avalonia 项目可以通过修改编译选项来全局开启 “编译绑定”。
启用编译绑定后可以完全舍弃基于反射的绑定,这对于需要启用 NativeAot 的平台(安卓与IOS)是非常关键的。

当前项目的内部实现依旧是使用基于反射的绑定类来实现多语言切换的。如果可以切换至纯编译绑定将会大幅度提升跨平台的可用性。
由于我暂时还没有完全掌握项目代码。因此,我可能无法提交 PR 😂,作者如果可以的话不知能否尝试将内部实现切换为编译绑定?

我这里可以提供一段我在自己项目内使用的一段 helper function 来帮助您创建编译绑定:

public static IDisposable CompiledBind(
        this AvaloniaObject bindTo,
        AvaloniaProperty bindToProperty,
        string bindingPath,
        object source,
        Type propertyType,
        Func<object, object?> getter,
        Action<object, object?>? setter = null)
    {
        var clrProperty = new ClrPropertyInfo(
            bindingPath,
            getter,
            setter,
            propertyType);

        var pathBuilder = new CompiledBindingPathBuilder();
        pathBuilder = pathBuilder.SetRawSource(source);
        pathBuilder = pathBuilder.Property(
            clrProperty,
            PropertyInfoAccessorFactory.CreateInpcPropertyAccessor);
        var path = pathBuilder.Build(); // 这里的 path 类型为 IBinding,可以直接用在其他地方

        var cb = new CompiledBindingExtension(path);
        var ib = cb.Initiate(bindTo, bindToProperty)!;

        return BindingOperations.Apply(bindTo, bindToProperty, ib, null);
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions