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

Avalonia 11:UserControl中TextBlock无法绑定ViewModel属性

解决Avalonia MVVM绑定找不到属性的问题

问题根源

Avalonia的数据绑定仅支持绑定带get/set访问器的公共属性,你ViewModel中的TEXT是公共字段(Field)而非属性(Property),绑定系统无法识别字段,因此抛出Error AVLN:0004错误。

修复步骤

1. 将ViewModel中的字段改为规范属性(推荐用CommunityToolkit.Mvvm特性)

你已引用CommunityToolkit.Mvvm,可以用[ObservableProperty]特性自动生成符合MVVM规范的属性,同时自动实现INotifyPropertyChanged(支持UI自动更新):

修改后的ViewModel代码:

using TouchPanel.DataModel;
using CommunityToolkit.Mvvm.ComponentModel;

namespace TouchPanel.ViewModels
{
    // 必须添加partial关键字,让工具自动生成属性代码
    public partial class PickUpParcelViewModel : ViewModelBase
    {
        // 用ObservableProperty生成Text属性,字段名以_开头
        [ObservableProperty]
        private string _text = "ASDHASDJKHASD";

        [ObservableProperty]
        private string _textBoxPhoneNumber = string.Empty;

        [ObservableProperty]
        private string _textBoxPickUpCode = string.Empty;

        private PickUpParcel _pickUpParcelDataModel;

        public PickUpParcelViewModel()
        {
            _pickUpParcelDataModel = new PickUpParcel();
            // 直接使用生成的属性名(首字母自动大写)
            TextBoxPhoneNumber = _pickUpParcelDataModel.PhoneNumber;
            TextBoxPickUpCode = _pickUpParcelDataModel.PickUpCode;
        }
    }
}

2. 调整XAML中的绑定路径

[ObservableProperty]会把_text字段生成为名为Text的公共属性,因此XAML绑定需对应修改:

<TextBlock Text="{Binding Text}"></TextBlock>

可选:手动定义属性(无需工具生成)

如果不想依赖自动生成,也可以手动编写属性并触发通知:

private string _text = "ASDHASDJKHASD";
public string TEXT
{
    get => _text;
    // 调用ViewModelBase的SetProperty方法触发UI更新通知
    set => SetProperty(ref _text, value);
}

这种情况下,XAML中的{Binding TEXT}可以保持不变。

3. 同步修复DataModel(为后续绑定做准备)

你的DataModel里的PhoneNumber和PickUpCode也是字段,后续若要绑定这些值,同样需要改为属性:

namespace TouchPanel.DataModel
{
    public class PickUpParcel
    {
        public string PhoneNumber { get; set; } = "PHONENUMBERTEST";
        public string PickUpCode { get; set; } = "PICKUPCODETEST";
    }
}

额外注意事项

  • 确保View的DataContext已正确绑定到ViewModel实例,通常可在View构造函数中设置:
    public PickUpParcelView()
    {
        InitializeComponent();
        DataContext = new PickUpParcelViewModel();
    }
    
  • 绑定名称区分大小写,XAML中的绑定路径必须与ViewModel属性名完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:15:57