在 Xamarin MvvmCross 中将对象从父对象传递给子对象
Pass object from parent to child in Xamarin MvvmCross
我有一个 SlideListViewModel:
public class SlideListViewModel : MvxViewModel
{
private readonly IServerClient _serverClient;
private ICollection<SlideListItemViewModel> _slides;
private IMapperService _mapper;
public ICollection<SlideListItemViewModel> Slides { get => _slides; set => SetProperty(ref _slides, value); }
public SlideListViewModel(IServerClient serverClient, IMapperService mapper)
{
_serverClient = serverClient;
_mapper = mapper;
}
public override async Task Initialize()
{
await base.Initialize();
Slides = _mapper.Map<ICollection<SlideListItemViewModel>>(await _serverClient.GetSlideList());
}
}
我有一个 SlideListItemViewModel:
public class SlideListItemViewModel : MvxViewModel
{
private long _id;
private string _title;
public long Id { get => _id; set => SetProperty(ref _id, value); }
public string Title { get => _title; set => SetProperty(ref _title, value); }
public IMvxCommand DeleteCommand => new MvxCommand<IServerClient>(DeleteCommandHandler);
public async void DeleteCommandHandler(IServerClient serverClient)
{
var delete = await UserDialogs.Instance.ConfirmAsync(new ConfirmConfig
{
Title = "Delete slide",
Message = "Are you sure you want to delete this slide?",
OkText = "Yes",
CancelText = "No"
});
if (!delete)
return;
//Here I should user my serverClient
}
}
是否可以从 SlideListViewModel
向接口 _serverClient
传递命令?我尝试在 slidelistitemviewmodel.axml 中绑定,但没有任何反应...
<Button
local:MvxBind="Click DeleteCommand, CommandParameter=_serverClient"
style="@style/ButtonSlide"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Delete" />
有人可以帮我吗???
您需要在 SlideListItemViewModel 中提供它。 SlideListItemViewModel.xaml 无权访问 SlideListViewModel。
不要费心让它成为命令参数,只需在创建项目时将其从 SlideListViewModel 传入即可。在 SlideListItemViewModel.cs 中添加 属性:
public class SlideListItemViewModel : MvxViewModel
{
private long _id;
private string _title;
private IServerClient _serverClient;
public long Id { get => _id; set => SetProperty(ref _id, value); }
public string Title { get => _title; set => SetProperty(ref _title, value); }
public IServerClient ServerClient {get => _serverClient; set => SetProperty(ref _serverClient, value; }
public IMvxCommand DeleteCommand => new MvxCommand(DeleteCommandHandler);
public async void DeleteCommandHandler()
{
var delete = await UserDialogs.Instance.ConfirmAsync(new ConfirmConfig
{
Title = "Delete slide",
Message = "Are you sure you want to delete this slide?",
OkText = "Yes",
CancelText = "No"
});
if (!delete)
return;
//Here I should user my serverClient
}
}
在 SlideListViewModel.cs 中创建时传递它:
public override async Task Initialize()
{
await base.Initialize();
Slides = _mapper.Map<ICollection<SlideListItemViewModel>>(await _serverClient.GetSlideList());
foreach(var slide in Slides)
{
slide.ServerClient = _serverClient;
}
}
并将其从 SlideListItemViewModel.xaml 中的绑定中取出:
local:MvxBind="Click DeleteCommand"
我有一个 SlideListViewModel:
public class SlideListViewModel : MvxViewModel
{
private readonly IServerClient _serverClient;
private ICollection<SlideListItemViewModel> _slides;
private IMapperService _mapper;
public ICollection<SlideListItemViewModel> Slides { get => _slides; set => SetProperty(ref _slides, value); }
public SlideListViewModel(IServerClient serverClient, IMapperService mapper)
{
_serverClient = serverClient;
_mapper = mapper;
}
public override async Task Initialize()
{
await base.Initialize();
Slides = _mapper.Map<ICollection<SlideListItemViewModel>>(await _serverClient.GetSlideList());
}
}
我有一个 SlideListItemViewModel:
public class SlideListItemViewModel : MvxViewModel
{
private long _id;
private string _title;
public long Id { get => _id; set => SetProperty(ref _id, value); }
public string Title { get => _title; set => SetProperty(ref _title, value); }
public IMvxCommand DeleteCommand => new MvxCommand<IServerClient>(DeleteCommandHandler);
public async void DeleteCommandHandler(IServerClient serverClient)
{
var delete = await UserDialogs.Instance.ConfirmAsync(new ConfirmConfig
{
Title = "Delete slide",
Message = "Are you sure you want to delete this slide?",
OkText = "Yes",
CancelText = "No"
});
if (!delete)
return;
//Here I should user my serverClient
}
}
是否可以从 SlideListViewModel
向接口 _serverClient
传递命令?我尝试在 slidelistitemviewmodel.axml 中绑定,但没有任何反应...
<Button
local:MvxBind="Click DeleteCommand, CommandParameter=_serverClient"
style="@style/ButtonSlide"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Delete" />
有人可以帮我吗???
您需要在 SlideListItemViewModel 中提供它。 SlideListItemViewModel.xaml 无权访问 SlideListViewModel。 不要费心让它成为命令参数,只需在创建项目时将其从 SlideListViewModel 传入即可。在 SlideListItemViewModel.cs 中添加 属性:
public class SlideListItemViewModel : MvxViewModel
{
private long _id;
private string _title;
private IServerClient _serverClient;
public long Id { get => _id; set => SetProperty(ref _id, value); }
public string Title { get => _title; set => SetProperty(ref _title, value); }
public IServerClient ServerClient {get => _serverClient; set => SetProperty(ref _serverClient, value; }
public IMvxCommand DeleteCommand => new MvxCommand(DeleteCommandHandler);
public async void DeleteCommandHandler()
{
var delete = await UserDialogs.Instance.ConfirmAsync(new ConfirmConfig
{
Title = "Delete slide",
Message = "Are you sure you want to delete this slide?",
OkText = "Yes",
CancelText = "No"
});
if (!delete)
return;
//Here I should user my serverClient
}
}
在 SlideListViewModel.cs 中创建时传递它:
public override async Task Initialize()
{
await base.Initialize();
Slides = _mapper.Map<ICollection<SlideListItemViewModel>>(await _serverClient.GetSlideList());
foreach(var slide in Slides)
{
slide.ServerClient = _serverClient;
}
}
并将其从 SlideListItemViewModel.xaml 中的绑定中取出:
local:MvxBind="Click DeleteCommand"