private void SetData() { _titles.Clear(); _values.Clear(); if (!string.IsNullOrEmpty(TitleMemberPath) && !string.IsNullOrEmpty(ValueMemberPath)) { var titleEval = new BindingEvaluator(TitleMemberPath); var valueEval = new BindingEvaluator(ValueMemberPath); foreach (var dataItem in DataSource) { _titles.Add(titleEval.Eval(dataItem).ToString()); _values.Add((double)valueEval.Eval(dataItem)); if (dataItem is INotifyPropertyChanged) { (dataItem as INotifyPropertyChanged).PropertyChanged -= OnDataSourceItemPropertyChanged; (dataItem as INotifyPropertyChanged).PropertyChanged += OnDataSourceItemPropertyChanged; } } _total = _values.Sum(); } }
void UpdateGrid() { if (_root == null || ItemsSource == null) { return; } _root.Children.Clear(); _root.ColumnDefinitions.Clear(); _independentValues.Clear(); _dependentValues.Clear(); BindingEvaluator independentBinding = new BindingEvaluator(IndependentValuePath); BindingEvaluator dependentBinding = new BindingEvaluator(DependentValuePath); int column = 0; foreach (var item in ItemsSource) { var independentValue = independentBinding.Eval(item).ToString(); var dependentValue = (long)dependentBinding.Eval(item); _dependentValues.Add(dependentValue); _root.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); TextBlock independentTB = new TextBlock(); independentTB.Text = independentValue; independentTB.FontSize = IndependentValueFontSize; independentTB.Foreground = IndependentValueBrush; independentTB.VerticalAlignment = VerticalAlignment.Center; independentTB.HorizontalAlignment = HorizontalAlignment.Center; independentTB.SetValue(Grid.RowProperty, 3); independentTB.SetValue(Grid.ColumnProperty, column++); _root.Children.Add(independentTB); } Rectangle rc = new Rectangle(); rc.Fill = GridLineBrush; rc.Height = 1; rc.SetValue(Grid.RowProperty, 1); rc.SetValue(Grid.ColumnSpanProperty, column); _root.Children.Add(rc); var min = _dependentValues.Min(); var max = _dependentValues.Max(); long temp = 0; if (min >= 0 && max >= 0) { temp = max; } else if (min < 0 && max >= 0) { temp = max - min; } else if (max < 0) { temp = -min; } var height = (this.ActualHeight - 1 - 30) / temp; for (int i = 0; i < _dependentValues.Count; i++) { var dependentValue = _dependentValues[i]; TextBlock dependentTB = new TextBlock(); dependentTB.Text = dependentValue.ToString(); dependentTB.FontSize = DependentValueFontSize; dependentTB.Foreground = dependentValue >= 0 ? PositiveValueBrush : NegativeValueBrush; dependentTB.VerticalAlignment = dependentValue > 0 ? VerticalAlignment.Top : VerticalAlignment.Bottom; dependentTB.HorizontalAlignment = HorizontalAlignment.Center; dependentTB.SetValue(Grid.RowProperty, dependentValue > 0 ? 2 : 0); dependentTB.SetValue(Grid.ColumnProperty, i); Rectangle dependentRC = new Rectangle(); dependentRC.Fill = dependentValue >= 0 ? PositiveValueBrush : NegativeValueBrush; dependentRC.Height = Math.Abs(height * dependentValue); dependentRC.Margin = new Thickness(20, 0, 20, 0); dependentRC.VerticalAlignment = dependentValue <= 0 ? VerticalAlignment.Top : VerticalAlignment.Bottom; dependentRC.SetValue(Grid.RowProperty, dependentValue <= 0 ? 2 : 0); dependentRC.SetValue(Grid.ColumnProperty, i); _root.Children.Add(dependentRC); _root.Children.Add(dependentTB); } }