子控件能否从父视图继承Compiled Binding?多场景绑定有效性问询
问题解答
编译绑定是否生效?
在这种父子视图结构下,只要父ContentView已经指定了x:DataType,编译绑定(Compiled Binding)是会正常发挥作用的。编译器会基于父级的x:DataType推断子控件绑定的上下文类型,即便子控件本身没指定x:DataType,绑定依然会被编译,不会退回到传统的反射绑定。
为什么警告依然存在?
警告的触发原因是共享控件的XAML本身没有明确指定x:DataType,编译器无法在控件级别提前验证绑定的合法性。但这只是编译期的提示,不会影响运行时编译绑定的实际效果——因为父视图已经提供了明确的上下文类型,绑定会被正确编译。
如何消除警告?
如果想彻底消除这个警告,有两种可行方案:
方案一:给共享控件添加泛型支持
让SharedPicker1成为泛型控件,接收ViewModel类型作为参数,然后在控件内部指定x:DataType为泛型类型。示例:<!-- SharedPicker1.xaml --> <Picker x:Class="YourNamespace.Controls.SharedPicker1<TViewModel>" Title="Select Item" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ItemDisplayBinding="{Binding ItemName}" x:DataType="vms:TViewModel" />使用时在父视图指定泛型参数:
<!-- ViewOne.xaml --> <ContentView x:Class="YourNamespace.ViewOne" x:DataType="vms:ViewModelOne"> <Controls:SharedPicker1 x:TypeArguments="vms:ViewModelOne" /> </ContentView>方案二:在共享控件内部使用设计时数据上下文
给共享控件的根元素添加设计时数据上下文,让编译器能识别绑定的类型,从而消除警告(不影响运行时):<!-- SharedPicker1.xaml --> <Picker x:Class="YourNamespace.Controls.SharedPicker1" Title="Select Item" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ItemDisplayBinding="{Binding ItemName}" d:DataContext="{d:DesignInstance Type={x:Type vms:BasePickerViewModel}}" />这里的
BasePickerViewModel是所有用到的ViewModel的基类,需要包含Items、SelectedItem等公共属性。
内容的提问来源于stack exchange,提问作者usefulBee
相关产品推荐
相关产品推荐

