如何在XAML页面头部设置页面级BindingContext?正确语法解析
嘿,我来帮你理清XAML页面头部设置BindingContext的正确姿势,还有你那个简洁写法的问题~
首先先纠正个小笔误:你提到的第一种写法里,<ContentView.ContextBinding>应该是<ContentView.BindingContext>,这个是属性元素语法,本身是完全正确的,标准写法如下:
<ContentView x:Class="MVVMFramework.VVMs.Red.RedView" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:vm="clr-namespace:MVVMFramework.VVMs.Red" BackgroundColor="Red"> <ContentView.BindingContext> <vm:RedViewModel/> </ContentView.BindingContext> <!-- 页面内容 --> </ContentView>
这种写法的优势是,如果你的RedViewModel需要设置构造函数参数或者额外属性,可以直接在这里展开配置,比如<vm:RedViewModel PageTitle="Red Page"/>。
再来说你想尝试的简洁写法——其实是可行的,但你的代码里多了不必要的Binding包装。正确的内联写法应该是直接用类型标记扩展创建ViewModel实例,赋值给BindingContext属性,不需要套Binding Source=那一层:
<ContentView x:Class="MVVMFramework.VVMs.Red.RedView" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:vm="clr-namespace:MVVMFramework.VVMs.Red" BackgroundColor="Red" BindingContext="{vm:RedViewModel}"> <!-- 页面内容 --> </ContentView>
为什么你原来的写法不对呢?因为{Binding ...}是用来绑定到已有数据源的属性,而你这里的需求是直接创建一个新的RedViewModel实例作为页面的BindingContext,所以不需要通过Binding标记扩展中转,{vm:RedViewModel}本身就会直接生成一个ViewModel实例并赋值给属性。
如果你的RedViewModel有带参数的构造函数,内联写法也支持传参,比如构造函数需要一个字符串参数:
BindingContext="{vm:RedViewModel 'Initial Load Value'}"
或者如果是命名参数:
BindingContext="{vm:RedViewModel WelcomeMessage='Hello Red Page'}"
总结一下:你想要的简洁内联写法完全可行,只要去掉多余的Binding Source=部分,直接用BindingContext="{vm:RedViewModel}"就可以啦。
内容的提问来源于stack exchange,提问作者Jungle_Jon

