Search code examples
c#wpfrandomtimerdatagrid

datagrid column dosen't get updated


I want to change a column values in a datagrid in a random way each 3 sec. I refered to a link from here( Displaying random numbers with a DispatcherTimer ) wish worked when i tested it on a textbox. But it dosen't update the datagrid column cell only when i double click a cell. This is the viewModel, the column i want to change is MarketPrice.

 public class PortfolioViewModel : INotifyPropertyChanged
{
    public Order order;
    private readonly Random random = new Random();
     public PortfolioViewModel()
    {
        this.PortfolioViewObs = PortfolioView();


        var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
        timer.Tick += new EventHandler(Timer_Tick);
        timer.Start();

    }

 public ObservableCollection<PortfolioView> PortfolioViewObs
     {
         get;
         set;
     }

 private void Timer_Tick(object sender, EventArgs e)
     {
         for (int i = 0; i < this.PortfolioViewObs.Count; i++)
         {
             this.PortfolioViewObs[i].MarketPrice = random.Next(20, 30);    
         }
     }

This is MainWindow.xaml

 <DataGrid x:Name="PortfolioGrid" ItemsSource="{Binding PortfolioViewObs}" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="60,32,0,0" VerticalAlignment="Top" Height="196" Width="630">
        <DataGrid.Columns>
            <DataGridTextColumn Width="100" Header="Security" Binding="{Binding Symbol}"/>
            <DataGridTextColumn Width="100" Header="Owned" Binding="{Binding Owned}"/>
            <DataGridTextColumn Width="100" Header="Unit Price" Binding="{Binding UnitPrice}"/>
            <DataGridTextColumn Width="100" Header="Total Cost" Binding="{Binding TotalCoast}"/>
            <DataGridTextColumn Width="100" Header="Market Price" Binding="{Binding MarketPrice}"  />
            <DataGridTextColumn Width="122" Header="Ordered Quantity" Binding="{Binding OrderedQuantity}"/>
        </DataGrid.Columns>
    </DataGrid>

this is mainwindow.xaml.cs

public MainWindow()
    {
        InitializeComponent();
        //ViewModel.PortfolioViewModel vm = new ViewModel.PortfolioViewModel();
        this.DataContext = new ViewModel.PortfolioViewModel();

    }

PortfolioView is a class implemented in a WCf service

[DataContract]
public class PortfolioView
{
    [DataMember]
    public string Symbol { get; set; }

    [DataMember]
    public float Owned { get; set; }

    [DataMember]
    public float UnitPrice { get; set; }

    [DataMember]
    public float TotalCoast { get; set; }

    [DataMember]
    public float MarketPrice { get; set; }

    [DataMember]
    public float OrderedQuantity { get; set; }
    [DataMember]
    public float AvailabeAmount { get; set; }

}

Solution

  • I found the solution.Actually, i just created my model(PortfolioView) class in the wpf client side (not from wcf service as i did ).So it worked perfectly. Thank you guys for you help.