簡體   English   中英

啟動時將數據傳遞給新ViewModel的最佳方法

[英]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。 兩個原因:

  1. 您可能需要使用相同模型的多個位置/視圖,並且您不希望在每個ViewModel中注意哪個屬性更改應該引發哪個其他屬性更改。 坦率地說那是凌亂和馬車。

  2. 有時,在VM層中,我們可能需要監聽模型中的更改,因此在這種情況下,自我通知模型也會有所幫助。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM