You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI中Styles.xaml无法识别LoadingView的BindableProperty(XFC0001)

.NET MAUI LoadingView自定义属性无法在样式中识别的解决方法

核心问题分析

LoadingView的自定义属性无法在Styles.xaml中被识别,抛出XFC0001错误,根源在于BindableProperty字段的定义不符合MAUI规范,同时存在属性声明顺序问题:

  1. 所有BindableProperty字段被定义为实例级(无static修饰符),但MAUI要求BindableProperty必须是类级静态只读字段,样式系统依赖静态字段识别自定义属性。
  2. CLR属性声明在BindableProperty字段之前,导致设计器和样式系统无法正确关联属性与对应的BindableProperty。

修复步骤

1. 修正BindableProperty字段的静态性

将所有BindableProperty字段改为public static readonly,示例如下:

// 修正前(无static)
public readonly BindableProperty StyleTitleProperty = BindableProperty.Create(nameof(StyleTitle), typeof(Style), typeof(LoadingView));

// 修正后(添加static)
public static readonly BindableProperty StyleTitleProperty = BindableProperty.Create(nameof(StyleTitle), typeof(Style), typeof(LoadingView));

对所有自定义属性的BindableProperty字段执行此修改,例如LoadingTitleProperty、LottieSourceProperty等。

2. 调整属性声明顺序

将BindableProperty静态字段的声明放在对应的CLR属性之前,确保样式系统能优先识别绑定属性元数据:

// 先声明静态BindableProperty字段
public static readonly BindableProperty StyleTitleProperty = BindableProperty.Create(nameof(StyleTitle), typeof(Style), typeof(LoadingView));

// 再声明CLR属性
public Style StyleTitle
{
    set => SetValue(StyleTitleProperty, value);
    get => (Style)GetValue(StyleTitleProperty);
}

3. 修复控件内部绑定(可选但必要)

LoadingView.xaml中默认绑定上下文并非控件自身,导致{Binding LottieSource}无法关联到自定义属性,需修改为绑定到控件实例:

方式一:使用RelativeSource绑定到父级

<VerticalStackLayout>
    <skia:SKLottieView x:Name="LottieView" WidthRequest="200" HeightRequest="200"
                       Source="{Binding LottieSource, Source={RelativeSource AncestorType={x:Type lottie:LoadingView}}}"
                       RepeatCount="{Binding LottieRepeat, Source={RelativeSource AncestorType={x:Type lottie:LoadingView}}}"/>
    <Label x:Name="LabelTitle" 
           Style="{Binding StyleTitle, Source={RelativeSource AncestorType={x:Type lottie:LoadingView}}}" 
           Text="{Binding Title, Source={RelativeSource AncestorType={x:Type lottie:LoadingView}}}"/>
    <!-- 其他控件同理 -->
</VerticalStackLayout>

方式二:使用x:Bind绑定到自身

先给ContentView设置x:Name:

<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:skia="clr-namespace:SkiaSharp.Extended.UI.Controls;assembly=SkiaSharp.Extended.UI"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Cephei.MAUI.Lottie.LoadingView"
             x:Name="This">

然后用x:Bind绑定:

<skia:SKLottieView x:Name="LottieView" WidthRequest="200" HeightRequest="200"
                   Source="{x:Bind This.LottieSource}"
                   RepeatCount="{x:Bind This.LottieRepeat}"/>

4. 清理重建项目

  • 清理项目的bin和obj文件夹
  • 重新生成解决方案
  • 重启Visual Studio确保元数据更新

验证修复

修改完成后,在Styles.xaml中即可正常设置LoadingView的自定义属性:

<Style TargetType="lottie:LoadingView">
    <Setter Property="LoadingTitle" Value="加载中..."/>
    <Setter Property="StyleTitle" Value="{StaticResource TitleStyle}"/>
</Style>

内容的提问来源于stack exchange,提问作者Cacangale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:44:54