MAUI.NET中如何通过ViewModel绑定从自定义控件获取值
MAUI.NET 自定义ABCPicker控件绑定到ViewModel属性的正确配置
问题根源
你的代码存在几个关键错误导致绑定失效:
- 错误使用附加属性:自定义控件自身的属性应使用普通
BindableProperty,附加属性是为其他控件扩展属性设计的,不适合作为自身属性使用。 - Picker绑定目标错误:XAML中直接绑定了
ChoosenDeviceTypeProperty静态字段,而非控件的实例属性。 - 绑定模式枚举错误:
BindingMode.TSimpleTwoWay是无效值,正确枚举为BindingMode.TwoWay。
修正步骤
1. 重构ABCPicker后台代码,改用普通可绑定属性
替换附加属性为控件自身的可绑定属性,并添加对应的实例属性:
public partial class ABCPicker : ContentView { // 定义普通可绑定属性 public static readonly BindableProperty ChoosenDeviceTypeProperty = BindableProperty.Create(nameof(ChoosenDeviceType), typeof(string), typeof(ABCPicker), "Detect by connect", BindingMode.TwoWay); // 供绑定使用的实例属性 public string ChoosenDeviceType { get => (string)GetValue(ChoosenDeviceTypeProperty); set => SetValue(ChoosenDeviceTypeProperty, value); } public ABCPicker() { BindingContext = this; InitializeComponent(); } }
2. 修正ABCPicker的XAML绑定
将Picker的SelectedItem绑定到控件的ChoosenDeviceType实例属性:
<ContentView ... x:Class="XYZ.Views.ABCPicker" x:DataType="views:ABCPicker"> <Grid> <Picker ItemsSource="{Binding ...}" SelectedItem="{Binding ChoosenDeviceType, Mode=TwoWay}"/> </Grid> </ContentView>
3. 确认父控件BroaderControlView的绑定(无需修改)
原代码中的绑定配置已经正确,保持即可:
<views:ABCPicker ChoosenDeviceType="{Binding MyResult, Mode=TwoWay}" />
4. 验证ViewModel中的命令逻辑
现在MyResult会自动同步ABCPicker的选中值,可直接在命令中使用:
MyCommand = new Command(() => { // MyResult已同步最新选中值,直接使用即可 // 后续业务逻辑 });
额外说明
- 若确实需要使用附加属性(为其他控件扩展该属性),则Picker的绑定需改为附加属性语法:
SelectedItem="{Binding Path=(views:ABCPicker.ChoosenDeviceType), Source={RelativeSource Self}, Mode=TwoWay}",但自定义控件自身属性优先使用普通可绑定属性更简洁。 - 确保
BaseViewModel的SetPropertyAndNotify方法正确实现了INotifyPropertyChanged接口,这是双向绑定生效的核心前提。
内容的提问来源于stack exchange,提问作者jaydopartu
相关产品推荐
相关产品推荐

