Я пытаюсь создать UserControl
, который можно перетаскивать в Canvas
. Я новичок в MVVM
и относительно нов в WPF
(также довольно нов в StackOverflow).
У меня есть модель представления, которая реализует INotifyPropertyChanged
, для нового UserControl
, который имеет свойства, называемые "Top" и "Left". Я хотел бы связать свойства Top и Left моей модели вида с прикрепленными Canvas.Left
и Canvas.Top
UserControl
. По причинам, в которые я не пойду, я не могу использовать XAML
.
Вот как я реализовал свои свойства Left (и аналогично Top) (пока не знаю, как заставить работать подсветку кода):
public class FooViewModel : INotifyPropertyChanged
{
// . . .
double _left;
public double Left
{
get { return _left; }
set
{
if(_left != value)
{
_left = value;
NotifyPropertyChanged("Left");
}
}
}
// . . .
}
Вот как я реализовал свой 'UserControl':
public class FooControl : UserControl
{
// . . .
private FooViewModel _vm;
public FooControl(FooViewModel vm)
{
_vm = vm;
this.DataContext = _vm;
Binding b = new Binding("Left");
b.Mode = BindingMode.TwoWay;
this.SetBinding(Canvas.LeftProperty, b);
// . . .
}
// . . .
}
Для тестирования я вручную создал несколько экземпляров модели представления, установил для них свойства Left и Top, создал экземпляры моего UserControl
, передав их конструктору, и добавил их в Canvas. К сожалению, все мои добавленные элементы управления отображаются в верхнем левом углу Canvas, и отладчик показывает, что, хотя свойства Top и Left модели представления установлены правильно, вызывая Canvas.GetLeft(...)
и Canvas.GetTop(...)
для элементов управления возврат NaN
.
Что я делаю не так? Я выбрал неправильный подход?
Я пытался основать свой код на этом вопросе и ответе .
EDIT:
На самом деле, это работает! В моем коде была ошибка, когда UserControl
не получал правильную ссылку на экземпляр модели представления. Как только я подключил это правильно, это работало отлично. Спасибо всем!