Я разрабатываю приложение WPF, которое привязывается к DataGrid, как указано ниже:
<DataGrid AutoGenerateColumns="True"
ItemsSource="{Binding Source={StaticResource tradeViewModel},
Path=Result}"
Где Path, указывающий на свойство Result в модели представления, которое inturn вызывает TradePriceChanger.GetTrades()
Метод TradePriceChanger.GetTrades возвращает sList of Trade, как указано ниже:
public static class TradePriceChanger
{
static List<Trade> tradeList = new List<Trade>();
static int TradeCounter = 1;
static ManualResetEvent manualReset = new ManualResetEvent(false);
public static IEnumerable<Trade> GetTrades()
{
Thread t1 = new Thread(new ThreadStart(One));
t1.Start();
Thread t2 = new Thread(new ThreadStart(Two));
t2.Start();
manualReset.WaitOne();
return tradeList;
}
public static void One()
{
for (int i = 1; i < 10; i++)
{
tradeList.Add(new Trade ( "One" + i, i ));
}
Interlocked.Decrement(ref TradeCounter);
if (TradeCounter == 0)
manualReset.Set();
}
public static void Two()
{
for (int i = 1; i < 10; i++)
{
tradeList.Add(new Trade("Two" + i, i));
}
Interlocked.Decrement(ref TradeCounter);
if (TradeCounter == 0)
manualReset.Set();
}
}
А класс Trade имеет таймер, который обновляет свою цену до случайного значения через каждые 1 с.
public class Trade:INotifyPropertyChanged
{
private string _name;
private double _price;
public Trade(string name, double price)
{
_name = name;
_price = price;
TimerCallback callback = new TimerCallback(ChangePrice);
Timer timer = new Timer(callback, this, 0, 1000);
}
private static void ChangePrice(object obj)
{
if (obj is Trade)
{
Trade trade = obj as Trade;
trade.Price = trade.Price + ( new Random().Next(-1,2) * (new Random().NextDouble()));
}
}
public string Name { get { return _name; } set { _name = value; } }
public double Price
{
get
{
return _price;
}
set
{
_price = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Price"));
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
Теперь проблема в том, что значения в сетке обновляются правильно. Когда я запускаю только поток t1 в TradePriceChanger.GetTrades ().Но, если я запускаю оба, обновления в пользовательском интерфейсе не происходит.
Я что-то здесь упускаю.
Пожалуйста, дайте мне знать.
Спасибо, Махеш