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