Files
TradeBlotter/ViewModels/FeedStatisticsViewModel.cs
2026-02-24 12:20:56 -05:00

163 lines
4.6 KiB
C#

using System;
using System.Windows.Input;
using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Research.DynamicDataDisplay.DataSources;
using Microsoft.Research.DynamicDataDisplay.PointMarkers;
using MarketData;
using MarketData.Utils;
using MarketData.DataAccess;
using MarketData.MarketDataModel;
using TradeBlotter.DataAccess;
using TradeBlotter.Command;
using TradeBlotter.Model;
using MarketData.Cache;
using TradeBlotter.Cache;
namespace TradeBlotter.ViewModels
{
public class FeedStatisticsViewModel : WorkspaceViewModel
{
private String selectedFeedStatisticType=null;
private List<String> feedTypes=null;
private FeedStatistics feedStatistics = null;
private bool busyIndicator = false;
private RelayCommand refreshCommand;
private RelayCommand clearCacheCommand;
public FeedStatisticsViewModel()
{
base.DisplayName = "Feed Statistics";
feedTypes = FeedStatistic.GetFeedStatisticTypes();
PropertyChanged += OnViewModelPropertyChanged;
}
public override SaveParameters GetSaveParameters()
{
return null;
}
public override void SetSaveParameters(SaveParameters saveParameters)
{
}
public override bool CanPersist()
{
return true;
}
public ObservableCollection<FeedStatistic> AllItems
{
get;
private set;
}
public bool BusyIndicator
{
get { return busyIndicator; }
set
{
busyIndicator = value;
base.OnPropertyChanged("BusyIndicator");
}
}
private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs eventArgs)
{
if (eventArgs.PropertyName.Equals("SelectedFeedType"))
{
BusyIndicator = true;
Task workerTask = Task.Factory.StartNew(() =>
{
base.DisplayName = "Feed Statistics(" + selectedFeedStatisticType + ")";
base.OnPropertyChanged("DisplayName");
feedStatistics=CompositeDA.GetFeedStatistics(FeedStatistic.FromString(selectedFeedStatisticType));
this.AllItems = new ObservableCollection<FeedStatistic>(feedStatistics);
});
workerTask.ContinueWith((continuation) =>
{
BusyIndicator = false;
base.OnPropertyChanged("AllItems");
base.OnPropertyChanged("Statistics");
base.OnPropertyChanged("Title");
});
}
}
public override String Title
{
get
{
if (null == selectedFeedStatisticType ) return "";
return selectedFeedStatisticType;
}
}
public List<String> FeedTypes
{
get
{
return feedTypes;
}
set { ;}
}
public String SelectedFeedType
{
get { return selectedFeedStatisticType; }
set { selectedFeedStatisticType = value; base.OnPropertyChanged("SelectedFeedType"); }
}
public CompositeDataSource Statistics
{
get
{
return GetCompositeDataSource();
}
}
private CompositeDataSource GetCompositeDataSource()
{
if (null == feedStatistics) return null;
CompositeDataSource compositeDataSource;
var xData = new EnumerableDataSource<DateTime>(feedStatistics.Select(x => x.Date.Date));
xData.SetXMapping(x => (x.Ticks / 10000000000.0));
var yData = new EnumerableDataSource<double>(feedStatistics.Select(y => (double)y.Records));
yData.SetYMapping(y => y);
compositeDataSource = xData.Join(yData);
return compositeDataSource;
}
public ICommand RefreshCommand
{
get
{
if(refreshCommand==null)
{
refreshCommand=new RelayCommand(param => this.Refresh(),param => this.CanRefresh);
}
return refreshCommand;
}
}
public ICommand ClearCacheCommand
{
get
{
if(clearCacheCommand==null)
{
clearCacheCommand=new RelayCommand(param => this.ClearCache(),param => {return true;});
}
return clearCacheCommand;
}
}
private void ClearCache()
{
try{LocalPriceCache.GetInstance().Clear();}catch(Exception){;}
try{GBPriceCache.GetInstance().Clear();}catch(Exception){;}
// try{PriceCache.GetInstance().Clear();}catch(Exception){;}
MessageBox.Show("All caches have been re-intiialized.",base.DisplayName);
}
private void Refresh()
{
base.OnPropertyChanged("SelectedFeedType");
}
private bool CanRefresh
{
get { return true; }
}
}
}