我正在嘗試創建一個可在Canvas
中拖動的UserControl
。我是MVVM
的全新品牌,WPF
也是相對較新的品牌(對於StackOverflow也很新穎)。如何在代碼後面綁定Canvas.Left或Canvas.Top附屬屬性?
我有一個視圖模型,實現INotifyPropertyChanged
,爲新的UserControl
具有稱爲「頂」和「左」的屬性。我想將我的視圖模型的Top和Left屬性綁定到UserControl
的附件Canvas.Left
和Canvas.Top
。由於我不會涉及的原因,我不能使用任何XAML
。
這是怎麼了,我實現了我的左(和類似的頂部)性能(不知道如何使代碼高亮工作尚未):
public class FooViewModel : INotifyPropertyChanged
{
// . . .
double _left;
public double Left
{
get { return _left; }
set
{
if(_left != value)
{
_left = value;
NotifyPropertyChanged("Left");
}
}
}
// . . .
}
這是怎麼了,我實現了我的「用戶控件」:
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.GetLeft(...)
和Canvas.GetTop(...)
調用返回NaN
。
我在做什麼錯?我採取了錯誤的做法嗎?
我試着圍繞這個question & answer我的代碼。編輯: 其實,這是行不通的!我在代碼中出錯,UserControl
沒有正確引用視圖模型的實例。一旦我正確地把它勾起來,它工作得很好。感謝大家!
爲什麼'Mode = TwoWay'? – 2012-02-23 23:49:25
我試圖根據[這個問題]的答案我的解決方案(http://stackoverflow.com/questions/2545394/binding-the-position-and-size-of-a-usercontrol-inside-a-canvas- in-wpf),我認爲它基本上實現了我在'XAML'中想要的。在那裏他們提到'TwoWay'模式允許數據源(我的視圖模型)在用戶在畫布中移動控件時得到更新(最終我打算讓它們可拖動)。 – Pysul 2012-02-23 23:56:07
@Pysul:這取決於拖動的實現,在這種情況下編輯虛擬機,而不是畫布屬性。 – 2012-02-23 23:58:16