столбец таблицы данных не обновляется - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу изменить значения столбца в сетке данных случайным образом каждые 3 се c. Я сослался на ссылку отсюда ( Отображение случайных чисел с DispatcherTimer ) wi sh работало, когда я тестировал его в текстовом поле. Но это не обновляет ячейку столбца таблицы данных, только когда я дважды щелкаю по ячейке. Это viewModel, столбец, который я хочу изменить, это 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);    
         }
     }

Это 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>

Это mainwindow.xaml.cs

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

    }

PortfolioView - это класс, реализованный в службе WCf

[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; }

}

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Сохраните ссылку на DispatcherTimer в поле, чтобы предотвратить его сборку мусора:

public class PortfolioViewModel : INotifyPropertyChanged
{
    public Order order;
    private readonly Random random = new Random();
    private readonly DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };

    public PortfolioViewModel()
    {
        this.PortfolioViewObs = new ObservableCollection<PortfolioView>;
        timer.Tick += new EventHandler(Timer_Tick);
        timer.Start();
    }

    public ObservableCollection<PortfolioView> PortfolioViewObs { get; }

    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);
        }
    }
}

И реализуйте интерфейс INotifyPropertyChanged в классе PortfolioView и убедитесь, что вы подняли событие PropertyChanged для свойства MarketPrice всякий раз, когда ему присваивается новое значение.

0 голосов
/ 22 апреля 2020

Я нашел решение. На самом деле, я просто создал класс моей модели (PortfolioView) на стороне клиента wpf (не из службы wcf, как я). Так что он работал отлично. Спасибо, ребята, за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...