2017-07-29 78 views
0

棱鏡6.3.0棱鏡Xamarin形式的OnNavigatedTo

我導航到一個視圖,我設置的方法的OnNavigatedTo模型的一些屬性改變模型後不更新視圖。問題是在設置模型的屬性後,視圖不會更新。

我的模型看起來像這樣

public class Person 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

在我的ViewModel

public Person Model 
{ 
    get => _model; 
    set => SetProperty(ref _model, value); 
} 

該方法的OnNavigatedTo是

public void OnNavigatedTo(NavigationParameters parameters) 
{ 
    var personModel = (Persom)parameters["Model"]; 

    _model.Email = personModel.Email; 
} 

而在XAML

<Entry Text="{Binding Person.Email, Mode=TwoWay}"> 
</Entry> 

我也試過OnNavigatingTo方法,但沒有預期的結果。那麼當我瀏覽視圖時,我應該怎麼做以便用新數據更新視圖?

回答

1

使用setter而不是私有變量來設置模型。

public void OnNavigatedTo(NavigationParameters parameters) 
{ 
    var personModel = (Person)parameters["Model"]; 

    Model.Email = personModel.Email; 
} 

而且,你的XAML應該從Person.Email變化Model.Email

=========== EDITED ============

您只設置不調用SetProperty的模型的電子郵件,因此視圖不會隨新電子郵件集而更新。爲了有意見的更新,你需要將人物模型設置如下:

public class Person : BindableBase 
{ 
    public string Name { get; set; } 

    private string _email; 
    public string Email 
    { 
     get { return _email; } 
     set { SetProperty(ref _email, value); } 
    } 
} 

或代替只需設置電子郵件中的OnNavigatedTo,您可以設置Person對象。

public void OnNavigatedTo(NavigationParameters parameters) 
{ 
    var personModel = (Person)parameters["Model"]; 

    Model = personModel; 
} 
+0

不幸的是,它不起作用。你對XAML是正確的,當我輸入問題時是錯誤的。我用'_model'和'Model'嘗試過,但都沒有工作。我發現實現它的唯一方法是在賦值後調用'RaisePropertyChanged(「Model」);'但我不應該明確地進行這個調用。你有什麼主意嗎? – Dimitris

+0

我在你的問題中缺少一些信息。我已經更新了答案。 – lowleetak

+0

第二種方法適用於我(將公共屬性設置爲新對象)我沒有嘗試第一種方法。非常感謝。 – Dimitris

1

你可以在Prism Quickstart Templates上看到一個完整的工作示例。

有跡象表明,你需要做一些關鍵的東西:

直接綁定到模型的屬性是一個美妙的事情(這是坦率地說我的東西都在我的應用程序&演示的那樣)。然而,直接綁定到你的模型的屬性意味着你需要確保你的模型是可觀察的(實現INotifyPropertyChanged)。

public class Person : BindableBase 
{ 
    private string _email; 
    public string Email 
    { 
     get => _email; 
     set => SetProperty(ref _email, value); 
    } 
} 

注意 如果你使用PropertyChanged.Fody(如快速啓動模板),你可以簡化這個給(你不需要使用BindableBase,任何基類實現INotifyPropertyChanged,甚至只是接口加入該類將工作):

public class Person : BindableBase 
{ 
    public string Email { get; set; } 
} 

接下來,您需要讓您的ViewModel安裝程序接受您要傳遞的參數。請注意,對於Prism 6.3,您有幾個選項。

從棱鏡開始6。3,INavigationAware成爲兩個新的導航接口的組合,INavigatingAwareINavigatedAware。正如名稱建議的INavigatingAware句柄即將發生的導航(在將視圖推入導航堆棧之前),而INavigatedAware則處理剛剛發生的導航。結果是,如果您在將視圖推入堆棧時使用INavigatingAware.OnNavigatingTo來更新模型,它將顯示電子郵件,而使用INavigatedAware.OnNavigatedTo可能會導致明顯的UI更新。你選擇你的目的,你可能會去有關設置模式的兩種方法

無論如下:

public class ViewAViewModel : BindableBase, INavigatingAware 
{ 
    // This assumes you are using PropertyChanged.Fody as mentioned above 
    public Person Model { get; set; } 

    public void OnNavigatingTo(NavigationParameters parameters) 
    { 
     // Method 1: 
     Model = parameters.GetValue<Person>("Model"); 

     // Method 2: 
     if(parameters.TryGetValue<Person>("Model", out Model)) 
     { 
      // do something 
     } 

     // Method 3: 
     Model = new Person 
     { 
      Email = parameters.GetValue<string>("email"); 
     }; 
    } 
} 

注意 我要在這裏指出,具有Model與視圖模型的財產也是一個關鍵被命名爲Model並不重要。它可能是foobar並仍然有效。最重要的是,像關鍵比賽如下圖所示:

_navigationService.NavigateAsync("ViewA", new NavigationParameters 
{ 
    { "foo", new Person { Email = "[email protected]" } } 
}); 

Model = parameters.GetValue<Person>("foo"); 

最後需要確保你不綁定的對象類型,而是屬性名稱...您查看的綁定上下文(您的視圖模型)使用屬性名稱Model引用Person模型,以便您的XAML看起來像這樣:

<Entry Text="{Binding Model.Email}" /> 
相關問題