【问题标题】:Xamarin Forms Passing Parameters Between ViewModelsXamarin 表单在 ViewModel 之间传递参数
【发布时间】:2020-12-14 05:05:54
【问题描述】:

我有两个视图模型。第一个 SxCaseDetailViewModel 包含一个 SxCaseId 的详细信息。第二个视图模型 CaseStaffJoinViewModel 包含与 SxCaseId 相关的所有人员。我的 CaseStaffJoinViewModel 中没有任何相关数据。如何将 int SxCaseId 传递给 CaseStaffJoinViewModel 以便它显示所有相关数据?

ViewModel SxCaseDetailViewModel

公共类 SxCaseDetailViewModel : ViewModelBase {

    private ISxCaseDataService _sxCaseDataService;
    private ICaseStaffJoinDataService _caseStaffJoinDataService;
    private SxCase _selectedSxCase;


    public SxCaseDetailViewModel(IConnectionService connectionService,
        INavigationService navigationService, IDialogService dialogService,
        ICaseStaffJoinDataService caseStaffJoinDataService,
        ISxCaseDataService sxCaseDataService)
        : base(connectionService, navigationService, dialogService)
    {
        _sxCaseDataService = sxCaseDataService;
        _caseStaffJoinDataService = caseStaffJoinDataService;

    }

    public SxCase SelectedSxCase
    {
        get => _selectedSxCase;
        set
        {
            _selectedSxCase = value;
            OnPropertyChanged();
        }
    }


    public override async Task InitializeAsync(object navigationData)
    {
        IsBusy = true;

        SelectedSxCase = (SxCase) navigationData;

        IsBusy = false;
    }

    public ICommand CaseStaffJoinTappedCommand => new Command<SxCase>(OnCaseStaffJoinTapped);


    private void OnCaseStaffJoinTapped(SxCase selectedSxCase)
    {
        _navigationService.NavigateToAsync<CaseStaffJoinViewModel>(selectedSxCase);

    }

}

ViewModel CaseStaffJoinViewModel

public class CaseStaffJoinViewModel : ViewModelBase
{
    private ICaseStaffJoinDataService _caseStaffJoinDataService;
    private ObservableCollection<CaseStaffJoin> _caseStaffJoins;

    public CaseStaffJoinViewModel(IConnectionService connectionService,
        INavigationService navigationService, IDialogService dialogService,
        ICaseStaffJoinDataService caseStaffJoinDataService)
        : base(connectionService, navigationService, dialogService)
    {
        _caseStaffJoinDataService = caseStaffJoinDataService;
    }

    public ObservableCollection<CaseStaffJoin> CaseStaffJoins
    {
        get => _caseStaffJoins;
        set
        {
            _caseStaffJoins = value;
            OnPropertyChanged();
        }
    }


    public override async Task InitializeAsync(object navigationData)
    {
        if (navigationData is int)
        {
            IsBusy = true;
            // Get caseStaffJoins by id
            
            CaseStaffJoins = (ObservableCollection<CaseStaffJoin>) 
                await _caseStaffJoinDataService.GetCaseStaffJoinsAsync((int) navigationData);
            IsBusy = false;
        }

        else
        {
            
        }
    }

}

数据服务

class CaseStaffJoinDataService :BaseService, ICaseStaffJoinDataService
{
    HttpClient _client;

    private readonly IGenericRepository _genericRepository;


    public CaseStaffJoinDataService(IGenericRepository genericRepository,
        IBlobCache cache = null) : base(cache)
    {
        _genericRepository = genericRepository;
        _client = new HttpClient();

    }

    public async Task<ObservableCollection<CaseStaffJoin>> FilterAsync(int sxCaseId)
    {
        UriBuilder builder = new UriBuilder(ApiConstants.BaseApiUrl)
        {
            Path = $"{ApiConstants.CaseStaffsEndpoint}/{sxCaseId}"
        };

        IEnumerable<CaseStaffJoin> caseStaffJoins =
            await _genericRepository.GetAsync<IEnumerable<CaseStaffJoin>>(builder.ToString());

        
        return caseStaffJoins?.ToObservableCollection();
        
    }

    public async Task<CaseStaffJoin> GetCaseStaffJoinBySxCaseIdAsync(int sxCaseId)
    {
        UriBuilder builder = new UriBuilder(ApiConstants.BaseApiUrl)
        {
            Path = $"{ApiConstants.CaseStaffsEndpoint}/{sxCaseId}"
        };

        var caseStaffJoin = await _genericRepository.GetAsync<CaseStaffJoin>(builder.ToString());

        return caseStaffJoin;
    }

    public async Task<IEnumerable<CaseStaffJoin>> GetCaseStaffJoinsAsync(int sxCaseId)
    {
        UriBuilder builder = new UriBuilder(ApiConstants.BaseApiUrl)
        {
            Path = $"{ApiConstants.CaseStaffsEndpoint}/{sxCaseId}"
        };

        var caseStaffJoins = await _genericRepository.GetAsync<List<CaseStaffJoin>>(builder.ToString());



        return caseStaffJoins;
    }

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    您在导航中传递了SxCase

    private void OnCaseStaffJoinTapped(SxCase selectedSxCase)
    {
        _navigationService.NavigateToAsync<CaseStaffJoinViewModel>(selectedSxCase);
    }
    

    但您在接收InitializeAsync 中的数据时只检查int

    public override async Task InitializeAsync(object navigationData)
    {
        if (navigationData is int)
    

    需要匹配的类型 - 您需要传递 int 或检查 SxCase

    【讨论】:

      猜你喜欢
      • 2015-02-05
      • 2021-03-21
      • 1970-01-01
      • 2019-01-12
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多