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

.NET Maui如何将MainActivity.cs的字符串传递至ViewModel

在Android中将MainActivity的字符串传递到ViewModel的几种方法

1. 构造函数注入(最直接的方式)

初始化ViewModel时直接把字符串作为构造参数传入,ViewModel内部保存并绑定到视图标签,适合初始化时一次性传递数据的场景。

ViewModel代码示例:

public class MyViewModel : INotifyPropertyChanged
{
    private string _displayText;
    public string DisplayText
    {
        get => _displayText;
        set
        {
            _displayText = value;
            OnPropertyChanged(nameof(DisplayText));
        }
    }

    // 通过构造函数接收来自Activity的字符串
    public MyViewModel(string activityText)
    {
        DisplayText = activityText;
    }

    // 实现INotifyPropertyChanged,确保UI自动更新
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

MainActivity代码示例:

public class MainActivity : AppCompatActivity
{
    // 要传递的字符串变量
    private string _activityString = "这是来自MainActivity的内容";

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // 启用数据绑定
        var binding = DataBindingUtil.SetContentView<ActivityMainBinding>(this, Resource.Layout.activity_main);
        
        // 初始化ViewModel时传入字符串
        var viewModel = new MyViewModel(_activityString);
        binding.ViewModel = viewModel;
    }
}

2. 公共属性赋值

给ViewModel添加可绑定的公共属性,在MainActivity中拿到ViewModel实例后直接赋值,适合需要后续动态更新数据的场景。

ViewModel代码示例:

public class MyViewModel : INotifyPropertyChanged
{
    private string _displayText;
    public string DisplayText
    {
        get => _displayText;
        set
        {
            _displayText = value;
            OnPropertyChanged(nameof(DisplayText));
        }
    }

    // 空构造函数,方便实例化
    public MyViewModel() { }

    // INotifyPropertyChanged实现同上
}

MainActivity代码示例:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    var binding = DataBindingUtil.SetContentView<ActivityMainBinding>(this, Resource.Layout.activity_main);
    
    var viewModel = new MyViewModel();
    binding.ViewModel = viewModel;

    // 直接给ViewModel的属性赋值
    viewModel.DisplayText = _activityString;
}

3. 消息传递(解耦场景)

如果不想让Activity和ViewModel产生直接依赖,可以用消息机制传递数据,适合复杂页面或跨组件传递的场景。

ViewModel代码示例(以WeakReferenceMessenger为例):

public class MyViewModel : INotifyPropertyChanged
{
    private string _displayText;
    public string DisplayText
    {
        get => _displayText;
        set
        {
            _displayText = value;
            OnPropertyChanged(nameof(DisplayText));
        }
    }

    public MyViewModel()
    {
        // 订阅字符串类型的消息
        WeakReferenceMessenger.Default.Register<string>(this, (_, message) =>
        {
            DisplayText = message;
        });
    }

    // INotifyPropertyChanged实现同上
}

MainActivity代码示例:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    var binding = DataBindingUtil.SetContentView<ActivityMainBinding>(this, Resource.Layout.activity_main);
    binding.ViewModel = new MyViewModel();

    // 发送消息传递字符串
    WeakReferenceMessenger.Default.Send(_activityString);
}

内容的提问来源于stack exchange,提问作者taqasar-elcam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:42:28