c# - 启动时将数据传递到新 ViewModel 的最佳方法

标签 c# wpf mvvm mvvm-light

我正在使用 MVVM-Light 框架开发 WPF 数据库应用程序。我正在使用 SimpleIOC 注入(inject)我的数据服务,并且我的 ViewModel 通过 XAML 文件连接到 View 。但是,当打开新的 View 模型时,我通常还需要将另一个对象传递给 View 模型(假设我正在传递 CarId 的整数,以便我可以从数据库中获取实际的汽车)。

现在,我在 InitializeComponent() 之后通过在 View 上使用信使来传递它。然后,这会被 View 模型捕获。目前这确实有效,但有一些障碍。

首先,直到调用 View 模型的构造函数之后才会发送消息。假设我在 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 模型构造函数中初始化 ThisCar,否则在创建 ViewModel 时,我会在 ThisCar.Brand 上收到 null 错误。

ThisCar = new CarObject();

然后,在它被初始化为空对象后,消息将被调用,我将根据汽车ID从数据库中提取真正的汽车。

ThisCar = webService.GetCar(carId);

但是,当我执行此操作时,品牌属性不会更新,因为没有任何内容调用品牌的 OnPropertyChanged。

我有两种解决方法,但对我来说它们更像是黑客。首先是为需要更新的任何属性手动调用 OnPropertyChanged。其次,我删除了所有小属性,并将所有内容直接绑定(bind)到 ThisCar 属性(这意味着我必须在模型中实现 INotifyPropertyChanged)。

如果我只是挑剔,或者是否有更好的方法,请告诉我。我这样做的方式有效,但就是不适合我。谢谢。

最佳答案

好的,这就是我的想法,请告诉我这是否是一个糟糕的想法。

我创建了一个名为 IRepository 的接口(interface),因为我使用依赖注入(inject)来创建 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;
    }
}

现在要将值传递到存储库中,我将其放入父 View 模型中

 r.SetCarId(13);

为了接收新的 View 模型,我将其放入 View 模型构造函数中:

    public View2ViewModel(IChildView i, IRepository r)
    {
        int CarId;
        r.GetCarId((id) => CarId = id);
        thisCar = GetCarFromDatabase(CarId);
    }

在我看来,这可以解决问题,而不会破坏 MVVM 模式,并且由于我使用的 IOC 容器将所有接口(interface)成员创建为静态,因此我将在其余 View 中拥有这些数据。

我遇到的主要问题是它感觉像是一个全局变量,但这是我能想到的最好的办法。请告诉我这是否是一个坏主意。谢谢。

关于c# - 启动时将数据传递到新 ViewModel 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497991/

相关文章:

android - 如何在 mvvm android 中显示对话框

wpf - Unity容器将如何解析注册的类型

C# 等效于 Xaml 的 CommandParameter ="{Binding .}"

c# - 通过自连接更新 List<T>?

.net - WPF 的稳定性如何?

c# - Windows 应用商店应用增量序列化

c# - 如何以编程方式访问 Team Foundation Service 上的工作项?

WPF:调整项目大小以使所有项目可见

c# - 字互操作 C# : Insert new page using existing page

c# - if语句和 "?/:"运算符的区别