2016-06-03 10 views
0

Проблема: у меня есть ListBox с TextBlocks whos. Текстовое свойство связано с разными свойствами. Я хочу перетащить TextBlock на OxyPlot и создать график для создания нового LineSeries с коллекцией, которая должна быть привязана к той же привязке, что и для TextBlock (это имеет смысл?)В WPF, как скопировать привязку из TextBlock в пользовательскую коллекцию?

Я получил класс из TextBlock для обработки события OnMouseMove так:

protected override void OnMouseMove(MouseEventArgs e) 
    { 
     base.OnMouseMove(e); 
     if (CanDrag && (e.LeftButton == MouseButtonState.Pressed)) 
     { 
      // Make sure we have a data binding 
      BindingExpression binding = GetBindingExpression(TextProperty); 
      if(binding == null) 
      { return; } 
      // Package the data. 
      DataObject data = new DataObject(); 
      data.SetData("DragListText.Binding", binding); 

      // Inititate the drag-and-drop operation. 
      DragDrop.DoDragDrop(this, data, DragDropEffects.Copy); 
     } 
    } 

Также я производный класс от Oxy.Plot, который обрабатывает OnDrop:

protected override void OnDrop(DragEventArgs e) 
    { 
     base.OnDrop(e); 
     // DataObject must contain a DragListText.Binding object 
     if (e.Data.GetDataPresent("DragListText.Binding")) 
     { 
      BindingExpression binding = e.Data.GetData("DragListText.Binding") as BindingExpression; 
      AddSeries(binding); 
     } 
     e.Handled = true; 
    } 

функция AddSeries выполняет следующие действия:

public void AddSeries(BindingExpression binding) 
    { 
     plot1 = new PlotCollection(); 

     LineSeries newSeries = new LineSeries(); 
     newSeries.ItemsSource = plot1.Collection; 

     Series.Add(newSeries); 
    } 

И, наконец, PlotCollection определяется как:

public class PlotCollection : DependencyObject 
{ 
    public ObservableCollection<DataPoint> Collection; 

    public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(PlotCollection), new PropertyMetadata(0.0, new PropertyChangedCallback(OnValueChanged))); 

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { ((PlotCollection)d).AddLast(); } 

    public double Value 
    { 
     get { return (double)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public PlotCollection() 
    { 
     Collection = new ObservableCollection<DataPoint>(); 
    } 
    protected void AddLast() 
    { 
     Collection.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(DateTime.Now), Value)); 
    } 
} 

Так что мой вопрос заключается в следующем: Как создать привязку на PlotCollection.Value, что соответствует одному из TextBlock.Text?

+0

Лично я хотел бы попробовать работать с объектами данных, а не UI объектов. Поэтому вместо перетаскивания «TextBlock» вы перетаскиваете объект «TextBlock.DataContext». Затем OnDrop, у вас есть фактический объект, к которому привязан TextBlock, и может анализировать его, как вы хотите, в элемент данных, к которому привязан график OxyPlot. Например, для элементов перетаскивания/удаления элементов данных я обычно указываю людей на сообщение в блоге [Bea Stollnitz] (https://web.archive.org/web/20151107025019/http://www.zagstudio.com/blog/488) (К сожалению, он больше не существует, но у машины обратного пути есть его копия) – Rachel

+0

Привет, Рейчел, Спасибо за ваш ответ. Проблема в том, что у меня много данных, поступающих от ПЛК, который я храню как свойства в классе. Именно эти свойства я показываю в списке (используя текстовые блоки) и хочу перетащить на сюжет, а не на сами текстовые блоки. Так, например, у меня есть свойство Plc.HPU_Pressure как двойная привязка к текстовому блоку, и именно это свойство я хочу показать на графике. –

ответ

0

В вашем методе AddSeries, попробуйте добавить следующую строку кода:

BindingOperations.SetBinding(plot1, PlotCollection.ValueProperty, binding.ParentBinding); 
+0

J.H. ваш ответ казался правдоподобным и простым, но PlotCollection.Value не называется? Я установил DataContext на участок владельцу объекта, так что мне не хватает? –

0

обнаружили проблему,

мне нужно добавить PropertyChangedCallback к объявлению ValueProperty, как это:

public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(DynamicSeries), new PropertyMetadata(0.0, OnValueChanged)); 

И затем обрабатывать изменения свойств в обратном методе:

private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     PlotCollection ds = (PlotCollection)d; 
     ds.AppendValue((double)e.NewValue); 
    } 

Я полагаю, что я неправильно понял, как работает свойство Value ?!

Спасибо, что нашли время, чтобы попытаться помочь мне ...