你可以在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
成爲兩個新的導航接口的組合,INavigatingAware
和INavigatedAware
。正如名稱建議的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}" />
不幸的是,它不起作用。你對XAML是正確的,當我輸入問題時是錯誤的。我用'_model'和'Model'嘗試過,但都沒有工作。我發現實現它的唯一方法是在賦值後調用'RaisePropertyChanged(「Model」);'但我不應該明確地進行這個調用。你有什麼主意嗎? – Dimitris
我在你的問題中缺少一些信息。我已經更新了答案。 – lowleetak
第二種方法適用於我(將公共屬性設置爲新對象)我沒有嘗試第一種方法。非常感謝。 – Dimitris