简体   繁体   中英

Update Datagrid from another ViewModel

I have a simple app that stores different stock data, my add stock button opens a new window with a form and when I press save I add the stock to the database but the datagrid doesn't get updated

I access the static instance of my main Viewmodel from my EntryViewModel via:

Main View Model(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 

}

When I click the add stock button it fires the AddCommand which in turn fires the Addstock method, this adds the stock to the database and updates the list in the StockViewModel instance but it does not update the datagrid OnPropertyChanged for some reason

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>

Data Context of StockView Model:

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

Any suggestions?

The following sets the DataContext to an new instance of the StockViewModel which is not the same as the instance returned by the Instance property:

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

The fact that you can do this means that StockViewModel is not really a singleton. You should add a private constuctor to it to make it a real singleton if this is what you want:

private StockViewModel() { }

You would then set the DataContext to the instance returned by the Instance property:

<Window.DataContext>
    <x:Static Member="this:StockViewModel.Instance" />
</Window.DataContext>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM