MVVM使用有很多种,大家自行学习。这里为了示例连续,用第三库。
nuget CommunityToolkit.Mvvm
具体内容自行学习。我也说网上边学边用。
建立viewmode
[ObservableObject]
public partial class MainPageViewModel
{
//定义一个无参构造函数,方便创建对象时调用,因为下例中使用了有参构造函数
public MainPageViewModel() { }
//①简单类型属性和命令。注:RelayCommand的异步为AsyncRelayCommand===============================================
private string result = "HiWorld!";
public string Result
{
get => result;
//SetProperty方法,比较旧值和新值是否相等,如果不相等,则将新值value赋值给_result,并触发属性更改事件
set => SetProperty(ref result, value);
}
private RelayCommand clickMeCommand;
public RelayCommand ClickMeCommand =>
clickMeCommand ??= new RelayCommand(() => Result = "你好世界!");//如果_clickMeCommand不为空,则赋值回调函数
//②集合类型属性和命令(带参数)=================================================================================
//注,①集合List无事件通知机制,不能用于绑定属性;②RelayCommand<T>的异步为AsyncRelayCommand<T>
private ObservableCollection<string> names = new ObservableCollection<string> { "zs", "ls", "ww" };
public ObservableCollection<string> Names
{
get => names;
set => SetProperty(ref names, value);
}
private RelayCommand<string> addNameCommand;
public RelayCommand<string> AddNameCommand => addNameCommand ??= new RelayCommand<string>(AddName);
private void AddName(string name)
{
Names.Add(name);
}
//③复杂类型的某个属性,较少使用=================================================================================
//可以实现复杂类型某个属性更改通知,较少使用
//如果是定义User属性,则整个对象替换时,才会有属性更改通知,也就是引用类型是浅绑定,类似于Vue2的引用类型data
private readonly User user;
public MainPageViewModel(User user) => this.user = user;
public string Name
{
get => user.UserName;
//SetProperty重载方法,user.Name-旧值,value-新值,user-复杂类型。判断user.Name和新值value是否相等,如果不想等,则将新值赋值给u.Name,并触发属性更改事件
set => SetProperty(user.UserName, value, user, (user, value) => user.UserName = value);
}
//④Task类型属性,较少使用=====================================================================================
//主要用于加载任务的提示,如任务完成,通知UI更新,还没使用过。
private TaskNotifier<int> requestTask;
public Task<int> RequestTask
{
get => requestTask;
set => SetPropertyAndNotifyOnCompletion(ref requestTask, value);
}
依赖注入类
/// <summary>
/// 依赖注入
/// </summary>
public class ServiceLocator
{
//服务定位器字段,使用这个字段来获取服务
private IServiceProvider serviceProvider;
//******以下定义属性,通过serviceProvider返回需要的服务(对象)
public MainPageViewModel MainPageViewModel => serviceProvider.GetService<MainPageViewModel>();
//构造函数,创建ServiceLocator对象时,①创建容器;②注册ViewModel服务;③创建服务定位器。
public ServiceLocator()
{
var serviceCollection = new ServiceCollection();
//******以下注册服务
serviceCollection.AddSingleton<MainPageViewModel>();
//【注意顺序】,服务定义器在注册完所有服务后,再创建
serviceProvider = serviceCollection.BuildServiceProvider();
}
}
根页面App.xaml的资源字典中,创建ServiceLocator对象 ,一次性注册所有需要的服务
<ResourceDictionary>
<local:ServiceLocator x:Key="ServiceLocator"/>
</ResourceDictionary>
在View层,MainPage.xaml页面中,设置BindingContext,绑定ServiceLocator对象的MainPageViewModel属性
BindingContext="{Binding MainPageViewModel, Source={StaticResource ServiceLocator}}">
<VerticalStackLayout>
<Entry Text="{Binding UserName}" />
<Entry Text="{Binding Password}" />
<Label Text="{Binding Email}" />
<Label Text="{Binding Result}"/>
<Button Command="{x:Binding ClickMeCommand}"/>
</VerticalStackLayout>
最后的目录