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

如何在ResourceDictionary中绑定ViewModel属性?绑定报错排查

问题原因与解决办法

核心问题1:MostraGriglia不是可绑定属性

Xamarin.Forms的绑定系统只识别BindableProperty,你当前的MostraGriglia是普通CLR属性,绑定系统无法检测到它,因此会报错提示找不到对应的可绑定属性。

修正ArticoliDTSelector类代码

把MostraGriglia改为BindableProperty:

internal class ArticoliDTSelector : DataTemplateSelector
{
    public DataTemplate ElencoTemplate { get; set; }
    public DataTemplate GrigliaTemplate { get; set; }

    // 定义可绑定属性
    public static readonly BindableProperty MostraGrigliaProperty =
        BindableProperty.Create(nameof(MostraGriglia), typeof(bool), typeof(ArticoliDTSelector), false);

    public bool MostraGriglia
    {
        get => (bool)GetValue(MostraGrigliaProperty);
        set => SetValue(MostraGrigliaProperty, value);
    }

    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        return MostraGriglia ? GrigliaTemplate : ElencoTemplate;
    }
}

核心问题2:绑定的Source写法错误

你用Source={StaticResource viewmodels:DettaglioArticoliViewModel}是错误的,StaticResource需要先在资源中定义对应的ViewModel实例,而页面的ViewModel通常作为BindingContext存在。由于你已经设置了x:DataType="viewmodels:DettaglioArticoliViewModel",可以通过RelativeSource绑定到页面的BindingContext:

修正XAML中的绑定代码

<selector:ArticoliDTSelector x:Key="ArticoliTemplateSelector"                                            
                            MostraGriglia="{Binding CatalogoVisualizzato, Source={RelativeSource AncestorType={x:Type base:BasePage}}}"
                            ElencoTemplate="{StaticResource GridLinearList}"
                            GrigliaTemplate="{StaticResource GridImages}"/>

如果BasePage的BindingContext已经是DettaglioArticoliViewModel的实例,也可以简化为:

MostraGriglia="{Binding BindingContext.CatalogoVisualizzato, Source={RelativeSource AncestorType={x:Type base:BasePage}}}"

另外注意:你的ViewModel里catalogoVisualizzato是静态字段,会导致多个页面实例共享同一个值,建议改为实例字段(去掉static):

class DettaglioArticoliViewModel : BaseViewModel
{
    bool catalogoVisualizzato; // 移除static修饰符
    public bool CatalogoVisualizzato
    {
        get => catalogoVisualizzato;
        set => SetProperty(ref catalogoVisualizzato, value);
    }
 }

为何之前找不到CatalogoVisualizzato?

除了上述两个核心问题,你原绑定的Source写法完全不符合规范,绑定系统找不到对应的ViewModel实例,自然无法解析CatalogoVisualizzato属性。修正BindableProperty和Source路径后,绑定即可正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:50:43