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

Xamarin Forms中BaseViewModel子类调用方法后属性为null绑定异常

问题分析与解决方案

核心问题

你的代码存在两个关键问题:

  1. 子类代码结构错误:ChildViewModel中直接在类定义层级调用CallTest()和赋值returnedString是C#语法不允许的,这类执行语句必须放在构造函数、方法或属性访问器内部。
  2. 基类属性赋值逻辑可能失效:代码中写的setproprty是拼写错误,若实际的属性更新方法未正确实现,会导致私有字段_test无法被赋值。

修复步骤

1. 完善基类的属性更新逻辑

确保BaseViewModel正确实现INotifyPropertyChanged接口的通知逻辑,同时修正拼写错误:

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _test;
    public string Test
    {
        get { return _test; }
        set { SetProperty(ref _test, value); }
    }

    // 通用属性更新方法,实现通知逻辑
    protected void SetProperty<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null)
    {
        if (!EqualityComparer<T>.Default.Equals(backingField, value))
        {
            backingField = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public void CallTest()
    {
        Test = "This is string data";
    }
}

2. 修正子类的代码执行位置

将CallTest()调用和字段赋值移到子类的构造函数(或目标方法)中:

public class ChildViewModel : BaseViewModel
{
    private string _returnedString;

    public ChildViewModel()
    {
        CallTest();
        _returnedString = Test; // 此时Test会正确获取到赋值后的内容
    }

    // 可选:若需外部访问该值,可暴露为属性
    public string ReturnedString => _returnedString;
}

额外说明

如果你的逻辑不是在初始化时执行,只需将CallTest()和赋值语句移到对应的业务方法内即可,核心是保证代码在合法的执行上下文(构造函数/方法)中运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:22