2017-06-20 47 views
-1

在我viewmodelA,我有一個屬性,當我的fragmentA.axml按鈕被點擊,我做Mvxbind和屏幕更改,它顯示viewmodelB,我也發送一個http請求,我是得到預期的迴應。這正是我希望它工作的方式。但問題是,我似乎可以在我的fragmentB.axml頁面中顯示該響應(someNumber和status)。任何人都可以幫助我解決這個問題。謝謝!!MvvmCross - MvxBind沒有正確綁定

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"/> 
+0

您的類是否定義了:INotifyPropertyChanged?你沒有提供課堂定義 –

+1

我有點困惑。看起來你正在嘗試導航到ViewModelB,但是你想在視圖中顯示的屬性是在ViewModelA中? – Ulbo

+0

@Ulbo我看到你在說什麼,但我想發送http請求,當我點擊按鈕。但我的問題是,我不知道如何在另一個viewmodel的片段(即fragmentB)中顯示該數據。如果您知道我該如何處理這個問題,請告訴我。謝謝 –

回答

0

至於我可以看到你走t兩種選擇:

第一種選擇是等待發送http呼叫,直到您在ViewModelB中,並在那裏加載數據。

第二種選擇是在導航前等待http呼叫完成,然後將ViewModelA中提取的數據作爲ViewModelB的導航參數發送。

+0

對於第二種選擇,我如何在ViewModelA中發送數據。你能給個例子嗎? –

+1

斯圖爾特就如何在視圖模型之間傳遞參數給出了很好的答案。你應該去看看這裏:https://stackoverflow.com/questions/19058173/passing-complex-navigation-parameters-with-mvvmcross-showviewmodel – Ulbo

+1

請參閱傳遞參數的官方文檔:https://www.mvvmcross的.com /文檔/基本面/導航 – Martijn00

1

MvvmCross不會將一個ViewModel做到n個視圖。只允許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; 
} 

然後對在該視圖模型狀態和數量的道具。

2. 有你你的ViewModels之間共享,並保持它的狀態,並好好休息的護理服務呼叫:

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

    public async Task DoStuff() 
    { 
    } 
} 

然後在ViewModelA構造函數是:

public ViewModelA(IMyService service) 

在你的命令中:

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

Ctor在ViewModelB中會類似到ViewModelA,只是填充任何道具或有道具直接反映是什麼樣的服務:

public string Status => _service.Status; 

這只是兩個解決這個問題的辦法。