Я не уверен, что вы собираетесь делать, но похоже, что вы хотите отслеживать, как «свежие» или «устаревшие» значения, исходящие из фида. Если это так, INotifyPropertyChanged (сила за Свойства зависимостей), вероятно, не сделает вас счастливыми, так как это будет полностью зависеть от реализации этого интерфейса в отношении того, будет ли вам сказано, будет ли SAMPLE IS TAKEN против или нет ОБРАЗЕЦ ИЗМЕНЕН (они не та же концепция).
В зависимости от того, сколько у вас контроля над этим, я бы рекомендовал реализации «Устаревшие» отслеживания внутри ViewModel (вы используете MVVM, верно?)
Что-то вроде:
Model.cs :
using System;
using System.Windows.Threading;
namespace WpfApplication1
{
public class Model
{
private readonly double[] _data = new[] { 2.3, 2.4, 2.5, 2.4, 2.1, 2.1, 2.1, 2.1, 2.0, 2.1, 2.0, 2.1, 2.2, 2.2, 2.2, 2.2, 2.2, 2.4 };
private readonly DispatcherTimer _timer = new DispatcherTimer();
private int _nextSample;
public Model()
{
_timer.Interval = new TimeSpan(0, 0, 0, 1);
_timer.Tick += _timer_Tick;
_timer.Start();
}
public event EventHandler<SampleTakenEventArgs> SampleTaken;
private void _timer_Tick(object sender, EventArgs e)
{
if (SampleTaken != null)
{
SampleTaken(this, new SampleTakenEventArgs { SampleValue = _data[_nextSample] });
}
_nextSample = (++_nextSample%_data.Length);
}
}
}
View.xaml:
<Window x:Class="WpfApplication1.View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBlock Text="{Binding Sample}"/>
<TextBlock Text="{Binding StaleCount}"/>
</StackPanel>
</Window>
View.xaml.cs:
using System.Windows;
namespace WpfApplication1
{
public partial class View : Window
{
public View()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
}
ViewModel.cs:
using System.ComponentModel;
namespace WpfApplication1
{
public class ViewModel : INotifyPropertyChanged
{
private readonly Model _model;
private double _sample;
private int _staleCount;
public ViewModel()
{
_model = new Model();
_model.SampleTaken += _model_SampleTaken;
}
public double Sample
{
get { return _sample; }
set
{
_sample = value;
OnPropertyChanged("Sample");
}
}
public int StaleCount
{
get { return _staleCount; }
set
{
_staleCount = value;
OnPropertyChanged("StaleCount");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
private void _model_SampleTaken(object sender, SampleTakenEventArgs e)
{
if (e.SampleValue == Sample)
{
StaleCount++;
}
else
{
StaleCount = 0;
}
Sample = e.SampleValue;
}
protected void OnPropertyChanged(string propertyName)
{
var propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
Можете ли вы поделиться кодом, по которому вы говорите? – Ragepotato