[英]Best Way to Pass Data to new ViewModel when it is initiated
我正在使用MVVM-Light Framework處理WPF數據庫應用程序。 我使用SimpleIOC來注入我的數據服務,我的ViewModel連接到XAML文件中的視圖。 但是,在打開新的視圖模型時,我通常還需要將另一個對象傳遞給視圖模型(假設我傳遞的是CarId的整數,因此我可以從數據庫中獲取實際的Car)。
現在我在InitializeComponent()之后使用View上的messenger傳遞這個。 然后由View Model捕獲。 這目前確實有效,但它有一些挫折。
首先,在調用視圖模型的構造函數之前,不會發送消息。 假設我在ViewModel中有一個ThisCar對象屬性,並且我有一個二級屬性,如一個名為Brand的字符串,它返回ThisCar.Brand。
public const string ThisPersonPropertyName = "ThisCar";
private Model.Car _thisCar;
public Model.Car ThisCar
{
get
{
return _thisCar;
}
set
{
if (_thisCar== value)
{
return;
}
RaisePropertyChanging(ThisCarPropertyName);
_thisCar= value;
RaisePropertyChanged(ThisCarPropertyName);
}
}
public const string BrandPropertyName = "Brand";
public string Brand
{
get
{
return ThisCar.Brand;
}
set
{
if (ThisCar.Brand == value)
{
return;
}
RaisePropertyChanging(BrandPropertyName);
ThisCar.Brand = value;
RaisePropertyChanged(BrandPropertyName);
}
}
現在當構造函數被調用時,我必須在View Model Constructor中初始化ThisCar,就像這樣,否則我在創建ViewModel時會在ThisCar.Brand上得到null錯誤。
ThisCar = new CarObject();
然后,在將其初始化為空對象后,將調用Message,我將根據Car ID從數據庫中提取真實Car。
ThisCar = webService.GetCar(carId);
但是,當我這樣做時,品牌屬性不會更新,因為沒有任何東西為品牌調用OnPropertyChanged。
我有兩個工作,但他們覺得更像是我的黑客。 首先,為任何需要更新的屬性手動調用OnPropertyChanged。 其次是刪除所有小屬性,並將所有內容直接綁定到ThisCar屬性(這意味着我必須在我的模型中實現INotifyPropertyChanged)。
如果我只是挑剔,或者有更好的方法,請告訴我。 我這樣做的方式有效,但不能和我坐在一起。 謝謝。
好的,所以這就是我想出的,如果這是一個可怕的想法,請告訴我。
我創建了一個名為IRepository的接口,因為我使用依賴注入來創建View模型。 這是實施:
public interface IRepository
{
void GetCarId(Action<int> callback);
void SetCarId(int value);
}
接下來,我創建一個繼承自IRepository的類
public class Repository : IRepository
{
private int CarId;
public void GetCarId(Action<int> callback)
{
callback(CarId);
}
public void setDictionary(int carId)
{
CarId = carId;
}
}
現在將值傳遞到存儲庫中,我將其放入父視圖模型中
r.SetCarId(13);
並且在新視圖中接收模型我把它放在View Models Constructor中:
public View2ViewModel(IChildView i, IRepository r)
{
int CarId;
r.GetCarId((id) => CarId = id);
thisCar = GetCarFromDatabase(CarId);
}
在我看來,這可以解決問題,而不會破壞MVVM模式,並且由於我使用的IOC容器創建了所有接口成員,因此我將在其余視圖中包含此數據。
我遇到的主要問題是它感覺像是一個全局變量,但這是我能想到的最好的變量。 如果這是一個非常糟糕的主意,請告訴我。 謝謝。
我會投票讓模型能夠通知那些變化,即在模型中實現INotifyPropertyChanged。 兩個原因:
您可能需要使用相同模型的多個位置/視圖,並且您不希望在每個ViewModel中注意哪個屬性更改應該引發哪個其他屬性更改。 坦率地說那是凌亂和馬車。
有時,在VM層中,我們可能需要監聽模型中的更改,因此在這種情況下,自我通知模型也會有所幫助。
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.