在我的视图模型A中,我有一个属性,当单击我的fragmentA.axml中的按钮时,我执行Mvxbind并且屏幕更改,它显示viewmodelB,并且我发送了一个http请求,并且我按预期得到了响应。这完全符合我想要的工作方式。但问题是,我似乎可以在我的 fragmentB.axml 页面(someNumber 和状态(中显示该响应。谁能帮我解决这个问题。谢谢!!
视图模型A.cs:
public MvxCommand SomeCommand
{
get
{
return new MvxCommand(() => something());
}
}
public async void something()
{
ShowViewModel<ViewModelB>();
SomeService serviceWrapper = new SomeService();
var model = {//Some Json request};
var result = await serviceWrapper.SubmitRequestAsync(model);
SomeResponse response = StaticMethods.DeserializeJson<SomeResponse>(result);
Status = response.SomeResponse1.Activity[0].Status.Description;
SomeNumber = response.SomeResponse1.SomeNumber;
Debug.WriteLine("SomeNumber : " + SomeNumber );
Debug.WriteLine("Status: " + Status);
}
private string _someNumber;
public string SomeNumber
{
get
{
return _someNumber;
}
set
{
SetProperty(ref _someNumber, value);
RaisePropertyChanged(() => SomeNumber);
}
}
private string _status;
public string Status
{
get
{
return _status;
}
set
{
SetProperty(ref _status, value);
RaisePropertyChanged(() => Status);
}
}
片段A.axml
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Submit"
android:id="@+id/Submit"
local:MvxBind="Click SomeCommand" />
片段B.axml
<TextView
android:text="Some Number:"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/SomeNum"
local:MvxBind="Text SomeNumber "/>
<TextView
android:text="Status:"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/status"
local:MvxBind="Text Status"/>
MvvmCross 不会对 n 个视图执行一个 ViewModel。只允许 1:1 关系。
有多种方法可以解决您的问题。
1.在 ShowViewModel 或新的导航服务中传递一个对象,该对象描述来自 ICommand 的结果。为此,您需要等待导航,直到您的请求完成:
var result = await GetSomeData();
ShowViewModel<ViewModelB>(new { status = Status, number = SomeNumber });
然后在视图模型 B 中:
public void Init(string status, string number)
{
Status = status;
Number = number;
}
然后在该视图模型中具有状态和数字的道具。
阿拉伯数字。有一个您在 ViewModel 之间共享的服务,并让它保持状态并处理您的休息电话:
public class MyService : IMyService
{
public string Status {get; set;}
public string Number {get; set;}
public async Task DoStuff()
{
}
}
那么在ViewModelA中,ctor 将是:
public ViewModelA(IMyService service)
在您的命令中:
public async void something()
{
await _service.DoSomething();
ShowViewModel<ViewModelB>();
}
ViewModelB 中的 Ctor 类似于 ViewModelA,只需填充任何道具或让道具直接反映服务中的内容,例如:
public string Status => _service.Status;
这些只是解决此问题的两种方法。
据我所知,您有两个选择:
第一种选择是等待向您发送http调用,直到您进入ViewModelB,然后在那里加载数据。
第二种选择是等到 http 调用完成再导航,并将在 ViewModelA 中获取的数据作为 ViewModelB 的导航参数发送。