2012-02-23 77 views
4

我正在嘗試創建一個可在Canvas中拖動的UserControl。我是MVVM的全新品牌,WPF也是相對較新的品牌(對於StackOverflow也很新穎)。如何在代碼後面綁定Canvas.Left或Canvas.Top附屬屬性?

我有一個視圖模型,實現INotifyPropertyChanged,爲新的UserControl具有稱爲「頂」和「左」的屬性。我想將我的視圖模型的Top和Left屬性綁定到UserControl的附件Canvas.LeftCanvas.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沒有正確引用視圖模型的實例。一旦我正確地把它勾起來,它工作得很好。感謝大家!

+0

爲什麼'Mode = TwoWay'? – 2012-02-23 23:49:25

+0

我試圖根據[這個問題]的答案我的解決方案(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

+0

@Pysul:這取決於拖動的實現,在這種情況下編輯虛擬機,而不是畫布屬性。 – 2012-02-23 23:58:16

回答

3

該代碼應該工作得很好。

控件實際上是立即畫布的孩子?如果沒有,它將無法正常工作。

+0

你說得對,它確實有效!今天早上用新鮮的眼睛看着調試器,我注意到由於構造函數中的拼寫錯誤(哎呀!),用戶控件沒有正確地連接到視圖模型。 謝謝大家的幫助 - 您確認代碼應該正常運行,而不是試圖解決一個不存在的問題。 – Pysul 2012-02-24 14:59:50