【问题标题】:MvvmCross - MvxBind not bind properlyMvvmCross - MvxBind 没有正确绑定
【发布时间】:2017-06-20 17:48:52
【问题描述】:

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

ViewmodelA.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);
        }
    }

fragmentA.axml

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Submit"
    android:id="@+id/Submit"
    local:MvxBind="Click SomeCommand" />

fragmentB.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"/>

【问题讨论】:

  • 您的班级是否定义了:INotifyPropertyChanged?您没有提供类定义
  • 我有点困惑。您似乎正在尝试导航到 ViewModelB,但您要在视图中显示的属性在 ViewModelA 中?
  • @Ulbo 我明白你在说什么,但是当我点击按钮时,我想发送 http 请求。但我的问题是我不知道如何在另一个视图模型的片段(即片段B)中显示该数据。如果你知道我该如何解决这个问题,请告诉我。谢谢

标签: c# android xamarin mvvmcross mvxbind


【解决方案1】:

MvvmCross 不会对 n 个 View 做一个 ViewModel。只允许 1:1 的关系。

有多种方法可以解决您的问题。

1。 传递 ShowViewModel 中的对象或描述 ICommand 结果的新 NavigationService。为此,您需要等待导航,直到您的请求完成:

var result = await GetSomeData();
ShowViewModel<ViewModelB>(new { status = Status, number = SomeNumber });

然后在 ViewModelB 中:

public void Init(string status, string number)
{
    Status = status;
    Number = number;
}

然后在该 ViewModel 中有 Status 和 Number 的道具。

2。 拥有一个您在 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;

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

【讨论】:

    【解决方案2】:

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

    第一个选项是等到您进入 ViewModelB 后再向您发送 http 调用,然后在此处加载数据。

    第二种选择是等到您的 http 调用完成后再进行导航,并将在 ViewModelA 中获取的数据作为 ViewModelB 的导航参数发送。

    【讨论】:

    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多