如何在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
相关产品推荐
相关产品推荐

