Как связать с вложенным свойством Canvas.Left или Canvas.Top в коде? - PullRequest
4 голосов
/ 24 февраля 2012

Я пытаюсь создать 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 не получал правильную ссылку на экземпляр модели представления. Как только я подключил это правильно, это работало отлично. Спасибо всем!

1 Ответ

3 голосов
/ 24 февраля 2012

Этот код должен работать просто отлично.

Являются ли элементы управления непосредственными дочерними элементами холста? Если нет, то это не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...