2012-02-23 9 views
4

Canvasでドラッグ可能なUserControlを作成しようとしています。私はMVVMに新品で、比較的新しいWPF(これはかなり新しいStackOverflowです)です。コードの背後にあるCanvas.LeftまたはCanvas.Top添付プロパティにどのようにバインドするのですか?

"Top"と "Left"というプロパティを持つ新しいUserControlに対して、INotifyPropertyChangedを実装するビューモデルがあります。ビューモデルのTopプロパティとLeftプロパティを添付してUserControlCanvas.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); 

     // . . . 
    } 
    // . . . 
} 

は、私は手動でいくつかのビューモデルのインスタンスを作成して、テストするには、コンストラクタにこれらを渡すことで、私の UserControlのインスタンスを作成し、それらを左とTopプロパティを設定し、「キャンバス」にそれらを追加しました。残念ながら、追加されたコントロールはすべてCanvasの左上隅に表示され、ビューモデルのTopプロパティとLeftプロパティが正しく設定されている間、コントロールの Canvas.GetLeft(...)Canvas.GetTop(...)を呼び出すと NaNが返されます。

私は間違っていますか?私は間違ったアプローチをしていますか?

私はこのquestion & answerの周りに自分のコードを置こうとしました。

編集: 実際には、これは機能します! UserControlがビューモデルのインスタンスへの適切な参照を取得していない私のコードで間違いがありました。一度それを正しく掛けてしまえば、それはうまくいった。みんな、ありがとう!

+0

なぜ 'Mode = TwoWay'ですか? –

+0

私は[この質問]の答えに私の解決策の基礎を立てようとしました(http://stackoverflow.com/questions/2545394/binding-the-position-and-size-of-a-usercontrol-inside-a-canvas- in-wpf)、これは基本的に私が 'XAML'で望むものを実装していると思います。彼らは、 'TwoWay'モードは、ユーザがキャンバス内でコントロールを動かすとデータソース(私のビューモデル)が更新されることを可能にしていると述べました(結局私はこれらをドラッグ可能にするつもりです)。 – Pysul

+0

@Pysul:それはそのドラッグの実装に依存し、キャンバスのプロパティの代わりにVMを編集するだけです。 –

答えて

3

そのコードは正常に動作するはずです。

実際にコントロールはです。キャンバスの子供たちはですか?そうでない場合、動作しません。

+0

あなたは正しく、うまくいきました!今朝新鮮な目でデバッガを見ると、コンストラクタの誤植のためにユーザコントロールがビューモデルに正しく接続されていないことに気付きました。 ありがとうございます。存在しない問題を解決しようとするのではなく、コードを正常に機能させることを確認していただきありがとうございます。 – Pysul

関連する問題