Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MvvmCross-MvxBind未正确绑定_C#_Android_Xamarin_Mvvmcross_Mvxbind - Fatal编程技术网

C# MvvmCross-MvxBind未正确绑定

C# MvvmCross-MvxBind未正确绑定,c#,android,xamarin,mvvmcross,mvxbind,C#,Android,Xamarin,Mvvmcross,Mvxbind,在我的viewmodelA中,我有一个属性,当单击fragmentA.axml中的按钮时,我执行Mvxbind,屏幕发生变化,它显示viewmodelB,并且我发送了一个http请求,我得到了预期的响应。这正是我想要的工作方式。但问题是,我似乎可以在我的fragmentB.axml页面(someNumber和status)中显示该响应。有人能帮我解决这个问题吗。谢谢 ViewmodelA.cs: public MvxCommand SomeCommand { 得到 { 返回新的MvxComman

在我的viewmodelA中,我有一个属性,当单击fragmentA.axml中的按钮时,我执行Mvxbind,屏幕发生变化,它显示viewmodelB,并且我发送了一个http请求,我得到了预期的响应。这正是我想要的工作方式。但问题是,我似乎可以在我的fragmentB.axml页面(someNumber和status)中显示该响应。有人能帮我解决这个问题吗。谢谢

ViewmodelA.cs:

public MvxCommand SomeCommand
{
得到
{
返回新的MvxCommand(()=>something());
}
}
公共异步void something()
{
ShowViewModel();
SomeService serviceWrapper=新的SomeService();
var model={//somejson请求};
var结果=等待serviceWrapper.SubmitRequestAsync(模型);
SomeResponse=StaticMethods.DeserializeJson(结果);
Status=response.SomeResponse1.Activity[0].Status.Description;
SomeNumber=response.SomeResponse1.SomeNumber;
Debug.WriteLine(“SomeNumber:+SomeNumber”);
Debug.WriteLine(“状态:+状态”);
}
私有字符串_someNumber;
公共字符串数
{
得到
{
返回某个数字;
}
设置
{
SetProperty(参考编号、值);
RaisePropertyChanged(()=>SomeNumber);
}
}
私有字符串_状态;
公共字符串状态
{
得到
{
返回状态;
}
设置
{
SetProperty(参考状态、值);
RaisePropertyChanged(()=>状态);
}
}
片段a.axml


片段b.axml


据我所知,您有两种选择:

第一个选项是等待向您发送http调用,直到您进入ViewModelB,然后在那里加载数据


第二个选项是等待http调用完成后再导航,并将在ViewModelA中获取的数据作为ViewModelB的导航参数发送。

MvvmCross不会对n个视图执行一个ViewModel。仅允许1:1关系

有各种各样的方法来解决你的问题

一,。 在ShowViewModel或新的NavigationService中传递一个对象,该对象描述来自ICommand的结果。要使其工作,您需要等待导航,直到您的请求完成:

var result = await GetSomeData();
ShowViewModel<ViewModelB>(new { status = Status, number = SomeNumber });
然后在该视图模型中设置状态和编号的道具

二,。 拥有在ViewModels之间共享的服务,并让它保持状态并处理您的rest呼叫:

public class MyService : IMyService
{
    public string Status {get; set;}
    public string Number {get; set;}

    public async Task DoStuff()
    {
    }
}
那么在ViewModel中,一个ctor将是:

public ViewModelA(IMyService service)
在您的命令中:

public async void something()
{
    await _service.DoSomething();
    ShowViewModel<ViewModelB>();
}

这只是解决此问题的两种方法。

您的类是否定义了:INotifyPropertyChanged?你没有提供课堂定义,我有点困惑。您似乎正在尝试导航到ViewModelB,但要在视图中显示的属性在ViewModelA中?@Ulbo我明白您的意思,但我想在单击按钮时发送http请求。但我的问题是,我不知道如何在另一个viewmodel的片段(即fragmentB)中显示该数据。如果你知道我如何解决这个问题,请告诉我。感谢第二个选项,如何在ViewModelA中发送数据。你能举个例子吗?斯图尔特就如何在视图模型之间传递参数给出了一个很好的答案。您应该在此处查看:请参阅有关传递参数的官方文档:
public void Init(string status, string number)
{
    Status = status;
    Number = number;
}
public class MyService : IMyService
{
    public string Status {get; set;}
    public string Number {get; set;}

    public async Task DoStuff()
    {
    }
}
public ViewModelA(IMyService service)
public async void something()
{
    await _service.DoSomething();
    ShowViewModel<ViewModelB>();
}
 public string Status => _service.Status;