.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
相关产品推荐
相关产品推荐

