Обновить Datagrid из другой ViewModel - PullRequest
0 голосов
/ 05 августа 2020

У меня есть простое приложение, в котором хранятся различные данные о запасах, моя кнопка добавления акций открывает новое окно с формой, и когда я нажимаю «Сохранить», я добавляю акции в базу данных, но сетка данных не обновляется

Я получаю доступ к экземпляру stati c моей основной модели просмотра из моей модели EntryViewModel через:

Модель основного представления (StockViewModel)

      public  class StockViewModel:INotifyPropertyChanged
{
    #region Fields
   

    private IList<Stock> _stockList;

    private StatsBuilder _statsBuilder = new StatsBuilder();
    
    public Stock stock = new Stock();
    
    public Stock10 stock10 = new Stock10();

    public Stock20 stock20 = new Stock20();       

    
    private ICommand _searchCommand;

    private static StockViewModel _instance = new StockViewModel();
    public static StockViewModel Instance { get { return _instance; } }
    public IList<Stock> Stocks
    {
        get { return _stockList; }
        set { _stockList = value; OnPropertyChanged(nameof(Stocks)); }
    }
    #endregion  

    #region Constructor

    public StockViewModel()
    {          
        
        using (var stocks = new AppDbContext())
        {

            Stocks = stocks.LowFloatStocks.ToList();
            
        }
        
        
    }

   
    #endregion

    #region Day1's

    private string _ticker;
    public string Ticker
    {
        get { return _ticker; }
        set 
        { 
            _ticker = value; 
            OnPropertyChanged("Ticker");
           
        }
        
    }

    private DateTime _date = DateTime.Now;
    public DateTime Date
    {
        get { return _date; }
        set { _date = value; }
    }

    private decimal _preivousClose;
    public decimal PreviousClose
    {
        get { return _preivousClose; }
        set { _preivousClose = value; OnPropertyChanged("PreviousClose"); }
    }

    private decimal _pmOpeningPrice;
    public decimal PM_OpeningPrice
    {
        get { return _pmOpeningPrice; }
        set { _pmOpeningPrice = value; OnPropertyChanged("PM_OpeningPrice"); }
    }

    private decimal _openingPrice;
    public decimal OpeningPrice
    {
        get { return _openingPrice; }
        set { _openingPrice = value; OnPropertyChanged("OpeningPrice"); }
    }

    private decimal _high;
    public decimal High
    {
        get { return _high ; }
        set { _high = value; OnPropertyChanged("High"); }
    }

    private decimal _low;
    public decimal Low
    {
        get { return _low; }
        set { _low = value; OnPropertyChanged("Low"); }  
    }

    private decimal _close;
    public decimal Close
    {
        get { return _close; }
        set { _close = value; OnPropertyChanged("Close"); }
    }

    private string _catalyst;
    public string Catalyst
    {
        get { return _catalyst; }
        set { _catalyst = value; OnPropertyChanged("Catalyst"); }
    }

    private decimal _float;
    public decimal Float
    {
        get { return _float; }
        set {_float = value; OnPropertyChanged("Float"); }
    }

    private string _dilution;
    public string Dilution
    {
        get { return _dilution; }
        set { _dilution = value; OnPropertyChanged("Dilution"); }
    }

    #endregion

    #region Day2's
    //public decimal Day2Open
    //{
    //    //get { return stock.Day2Open; }
    //    set { stock.Day2Open = value; OnPropertyChanged("Day2Open"); }
    //}

    //public decimal Day2High
    //{
    //    get { return stock.Day2High; }
    //    set { stock.Day2High = value; OnPropertyChanged("Day2High"); }
    //}

    //public decimal Day2Low
    //{
    //    get { return stock.Day2Low; }
    //    set { stock.Day2Low = value; OnPropertyChanged("Day2Low"); }
    //}

    //public decimal Day2Close
    //{
    //    get { return stock.Day2Close; }
    //    set { stock.Day2Close = value; OnPropertyChanged("Day2Close"); }
    //}

    #endregion

    #region Stats

    private Stock _selectedstock;
    public Stock SelectedStock 
    {
        private get
        {
            return _selectedstock;

        }
        set
        {
            _selectedstock = value;
            OnPropertyChanged("SelectedStock");
            GetStats(_selectedstock.Ticker);
        }
    }       
    public int Gaps10 { get { return stock10.Gaps10; } set { stock10.Gaps10 = value; OnPropertyChanged("Gaps10"); } }
    public decimal AvgGap10 { get {return stock10.AvgGap10; } set { stock10.AvgGap10 = value; OnPropertyChanged("AvgGap10"); } }         
    public int CloseGreen10 { get { return stock10.CloseGreen10; } set { stock10.CloseGreen10 = value; OnPropertyChanged("CloseGreen10"); } }
    public decimal CloseGreenPercent10 { get { return stock10.CloseGreenPercent10; } set { stock10.CloseGreenPercent10 = value; OnPropertyChanged("CloseGreenPercent10"); } }
    public int CloseRed10 { get { return stock10.CloseRed10; } set { stock10.CloseRed10 = value; OnPropertyChanged("CloseRed10"); } }
    public decimal CloseRedPercent10 { get { return stock10.CloseRedPercent10; } set { stock10.CloseRedPercent10 = value; OnPropertyChanged("CloseRedPercent10"); } }
    public decimal AvgSpike10 { get; set; }
    public decimal Downside10 { get; set; }
    public int PMFade10 { get { return stock10.PMFade10; } set { stock10.PMFade10 = value; OnPropertyChanged("PMFade10"); } }
    public decimal PMFadePercent10 { get { return stock10.PMFadePercent10; } set { stock10.PMFadePercent10 = value; OnPropertyChanged("PMFadePercent10"); } }

    public int Gaps20 { get {return stock20.Gaps20 ; } set { stock20.Gaps20 = value; OnPropertyChanged("Gaps20"); } }
    public decimal AvgGap20 { get { return stock20.AvgGap20; } set { stock20.AvgGap20 = value; OnPropertyChanged("AvgGap20"); } }
    public int CloseGreen20 { get { return stock20.CloseGreen20; } set { stock20.CloseGreen20 = value; OnPropertyChanged("CloseGreen20"); } }
    public decimal CloseGreenPercent20 { get { return stock20.CloseGreenPercent20; } set { stock20.CloseGreenPercent20 = value; OnPropertyChanged("CloseGreenPercent20"); } }
    public int CloseRed20 { get { return stock20.CloseRed20; } set { stock20.CloseRed20 = value; OnPropertyChanged("CloseRed20"); } }
    public decimal CloseRedPercent20 { get { return stock20.CloseRedPercent20; } set { stock20.CloseRedPercent20 = value; OnPropertyChanged("CloseRedPercent20"); } }
    public decimal AvgSpike20 { get; set; }
    public decimal Downside20 { get; set; }
    public int PMFade20 { get { return stock20.PMFade20; } set { stock20.PMFade20 = value; OnPropertyChanged("PMFade20"); } }
    public decimal PMFadePercent20 { get { return stock20.PMFadePercent20; } set { stock20.PMFadePercent20 = value; OnPropertyChanged("PMFadePercent20"); } }

    #endregion

    #region PropertyChange


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {

        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion 

    #region Commands       

   

    public ICommand SearchCommand => _searchCommand ?? (_searchCommand = new RelayCommand(param => this.SearchStock(param)));     

    



    #endregion

    #region Actions

   

    private void SearchStock(object _ticker)
    {
        try
        {
            var stock = Stocks.First(x => x.Ticker.Trim() == _ticker.ToString());
            _selectedstock = (Stock)stock;
            GetStats(_ticker.ToString());
        }
        catch (Exception)
        {
            MessageBox.Show("No matching Ticker");
        }
    }


    private void GetStats(string ticker)
    {
        //Stocks with 10% gap ups
        stock10 = _statsBuilder.GetStats10(ticker);
        stock20 = _statsBuilder.GetStats20(ticker);
        Gaps10 = stock10.Gaps10;
        AvgGap10 = stock10.AvgGap10;
        CloseGreen10 = stock10.CloseGreen10;
        CloseGreenPercent10 = stock10.CloseGreenPercent10;
        CloseRed10 = stock10.CloseRed10;
        CloseRedPercent10 = stock10.CloseRedPercent10;

        PMFade10 = stock10.PMFade10;
        PMFadePercent10 = stock10.PMFadePercent10;


        //Stock with 20% gap ups

        Gaps20 = stock20.Gaps20;
        AvgGap20 = stock20.AvgGap20;
        CloseGreen20 = stock20.CloseGreen20;
        CloseGreenPercent20 = stock20.CloseGreenPercent20;
        CloseRed20 = stock20.CloseRed20;
        CloseRedPercent20 = stock20.CloseRedPercent20;

        PMFade20 = stock20.PMFade20;
        PMFadePercent20 = stock20.PMFadePercent20;
    }

   


   
    #endregion 

}

Когда я нажимаю кнопку добавления акций, запускается команда AddCommand который, в свою очередь, запускает метод Addstock, это добавляет акции в базу данных и обновляет список в экземпляре StockViewModel, но по какой-то причине не обновляет сетку данных OnPropertyChanged

EntryViewModel:

 public ICommand AddCommand => _addCommand ?? (_addCommand = new RelayCommand(param => this.AddStock()));
    #endregion 

    #region PropertyChange


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {

        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion

    #region Methods
    private void AddStock()
    {
        using (var stocks = new AppDbContext())
        {
            stock.Id = 0;
            stock.Ticker = _ticker;
            stock.PreviousClose = _preivousClose;
            stock.PM_OpeningPrice = _pmOpeningPrice;
            stock.OpeningPrice = _openingPrice;
            stock.High = _high;
            stock.Low = _low;
            stock.Close = _close;
            stock.Catalyst = _catalyst;
            stock.Float = _float;
            stock.Dilution = _dilution;
            stocks.LowFloatStocks.Add(stock);
            stocks.SaveChanges();
            StockViewModel.Instance.Stocks = stocks.LowFloatStocks.ToList();
           

            Clear();

            
        }
    }

Data Grid Binding;

<DataGrid Name="StockGrid" Margin="5,5,5,5" Height="250" ItemsSource="{Binding Stocks}" IsReadOnly="True" AutoGeneratingColumn ="StockGrid_AutoGeneratingColumn" Grid.ColumnSpan="3" VerticalScrollBarVisibility="Auto" SelectedItem="{Binding SelectedStock, Mode=TwoWay}">
            </DataGrid>

Контекст данных модели StockView:

<Window.DataContext> <local1:StockViewModel/> </Window.DataContext>

Есть предложения?

1 Ответ

1 голос
/ 05 августа 2020

Следующее устанавливает DataContext в новый экземпляр StockViewModel, который не совпадает с экземпляром, возвращаемым свойством Instance:

<Window.DataContext> <local1:StockViewModel/> </Window.DataContext>

Тот факт, что вы можете сделать это означает, что StockViewModel на самом деле не синглтон. Вы должны добавить к нему частный конструктор, чтобы сделать его настоящим синглтоном, если это то, что вы хотите:

private StockViewModel() { }

Затем вы должны установить DataContext на экземпляр, возвращаемый свойством Instance:

<Window.DataContext>
    <x:Static Member="this:StockViewModel.Instance" />
</Window.DataContext>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...