Все еще не уверен, как это должно работать, но я нашел обходной путь.Метод Item1_MouseMove был обновлен для выполнения следующих операций:
- Найти объект данных, к которому привязан элемент управления;
- Установить свойства FieldCoordX и FieldCoordY этого объекта вместо установки'Canvas.LeftProperty' и 'Canvas.RightProperty' элемента управления.
Это выглядит следующим образом:
private void Item1_MouseMove(object sender, MouseEventArgs e)
{
if (bIsCaptured)
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
ISquadPlayerViewModel vmPlayer = element.DataContext as ISquadPlayerViewModel;
if (vmPlayer != null)
{
// Calculate the current position of the object.
double deltaH = e.GetPosition(null).X - mouseHorizontalPosition;
double deltaV = e.GetPosition(null).Y - mouseVerticalPosition;
double newLeft = deltaH + vmPlayer.FieldCoordX;
double newTop = deltaV + vmPlayer.FieldCoordY;
// Set new position of object.
vmPlayer.FieldCoordX = newLeft;
vmPlayer.FieldCoordY = newTop;
}
// Update position global variables.
mouseVerticalPosition = e.GetPosition(null).Y;
mouseHorizontalPosition = e.GetPosition(null).X;
}
}
}
Еще один элемент, который будет добавлен в исходное описание, настройкаобъект ItemsControl, который содержит все элементы управления:
public class MyItemsControl : ItemsControl
{
protected override void PrepareContainerForItemOverride(
DependencyObject element, object item)
{
FrameworkElement contentitem = element as FrameworkElement;
if (contentitem != null)
{
Binding leftBinding = new Binding("FieldCoordX");
Binding topBinding = new Binding("FieldCoordY");
leftBinding.Mode = BindingMode.TwoWay;
topBinding.Mode = BindingMode.TwoWay;
contentitem.SetBinding(Canvas.LeftProperty, leftBinding);
contentitem.SetBinding(Canvas.TopProperty, topBinding);
base.PrepareContainerForItemOverride(element, item);
}
}
}
Как вы можете видеть, наши элементы управления уже связаны со свойствами объектов данных.Поэтому нам нужно обновить не контрольные данные, а данные объекта.
Если кому-то интересно узнать больше, спросите.Я постараюсь помочь.