Как проектировать правильную архитектуру с помощью паттерна mvvm

Проблема в том что в Models нельзя использовать не ObservableCollection или List я подробно расскажу о проблеме и покажу.

Модель Param-Тут все хорошо я не нарушаю паттерн

 public class Param : ChangeProperty
    {
        string name { get; set; }
        string text { get; set; }

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }

        public string Text
        {
            get { return text; }
            set
            {
                name = value;
                OnPropertyChanged("Text");
            }
        }



        public Param(string name, string text)
        {
            Name = name;
            Text = text;
        }
    }

Модель Offer-тут уже начнутся проблемы,3-штуки ObservableCollection может сделать этот класс ViewsModels ?

class Offer:ChangeProperty
{
    string url { get; set; }
    public string Url
    {
        get { return url; }
        set
        {
            url = value;
            OnPropertyChanged("Url");
        }
    }

    decimal price { get; set; }
    public decimal Price
    {
        get { return price; }
        set
        {
            price = value;
            OnPropertyChanged("Price");
        }
    }

    string currencyId { get; set; }
    public string CurrencyId
    {
        get { return currencyId; }
        set
        {
            currencyId = value;
            OnPropertyChanged("CurrencyId");
        }
    }

    int categoryId { get; set; }
    public int CategoryId
    {
        get { return categoryId; }
        set
        {
            categoryId = value;
            OnPropertyChanged("CategoryId");
        }
    }

    public ObservableCollection<string> Picture { get; set; } = new ObservableCollection<string>();

    string name { get; set; }
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }
    string vendor { get; set; }
    public string Vendor
    {
        get { return vendor; }
        set
        {
            vendor = value;
            OnPropertyChanged("Vendor");
        }
    }
    public ObservableCollection<string> Description { get; set; } = new ObservableCollection<string>();
    public ObservableCollection<Param> Param { get; set; } = new ObservableCollection<Param>();

    int stock_quantity { get; set; }
    public int Stock_quantity
    {
        get { return stock_quantity; }
        set
        {
            stock_quantity = value;
            OnPropertyChanged("Stock_quantity");
        }
    }

    bool аvailable { get; set; }
    public bool Available
    {
        get { return аvailable; }
        set
        {
            аvailable = value;
            OnPropertyChanged("Available");
        }
    }

    int id { get; set; }
    public int Id
    {
        get { return id; }
        set
        {
            id = value;
            OnPropertyChanged("Id");
        }
    }
    public Offer(string url, decimal price, string currencyId, int categoryId, string name, string vendor, int stock_quantity, bool available, int id)
    {
        Url = url;
        Price = price;
        CurrencyId = currencyId;
        CategoryId = categoryId;
        Name = name;
        Vendor = vendor;
        Stock_quantity = stock_quantity;
        Available = available;
        Id = id;
    }
}

Модель Currency-тут нету проблем.

public class Currency:ChangeProperty
    {
        string id { get; set; }
        public string Id
        {
            get { return id; }
            set
            {
                id = value;
                OnPropertyChanged("Id");
            }
        }
        int rate { get; set; }
        public int Rate
        {
            get { return rate; }
            set
            {
                rate = value;
                OnPropertyChanged("Rate");
            }
        }
        public Currency(string id, int rate)
        {
            Id = id;
            Rate = rate;
        }
    }

ViewModel PriceCeatorViewModel-Тут я не нарушаю правила,может Модель Offer сделать ViewModel,потом наследовать PriceCeatorViewModel??

class PriceCeatorViewModel: ChangeProperty
    {
        string pathFile { get; set; }
        public string PathFile
        {
            get { return pathFile; }
            set
            {
                pathFile = value;
                OnPropertyChanged("PathFile");
            }
        }
        string name { get; set; }
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }

        string сompany { get; set; }
        public string Company
        {
            get { return сompany; }
            set
            {
                сompany = value;
                OnPropertyChanged("Company");
            }
        }
        string url { get; set; }
        public string Url
        {
            get { return url; }
            set
            {
                url = value;
                OnPropertyChanged("Url");
            }
        }
        string date { get; set; }
        public string Date
        {
            get { return date; }
            set
            {
                date = value;
                OnPropertyChanged("Date");
            }
        }
        public ObservableCollection<string> Сategories { get; set; }
        public ObservableCollection<Currency> Currencies { get; set; } 
        public ObservableCollection<Offer> Offers { get; set; } 



        public PriceCeatorViewModel()
        {
            PathFile = "Name file";
            Сategories = new ObservableCollection<string>();
            Currencies = new ObservableCollection<Currency>();
            Offers = new ObservableCollection<Offer>();

        }


        public DelegateCommand OvpenFile
        {
            get
            {
                return new DelegateCommand((obj) =>
                {
                    const string Filter = "XML files (*.XML)|*.XML";
                    OpenFileDialog dlg = new OpenFileDialog();
                    dlg.Filter = Filter;
                    if (dlg.ShowDialog() == true)
                    {
                        PathFile = dlg.FileName;
                    }
                });

            }
        }

    }

Ответы (0 шт):