Canvas
でドラッグ可能なUserControl
を作成しようとしています。私はMVVM
に新品で、比較的新しいWPF
(これはかなり新しいStackOverflowです)です。コードの背後にあるCanvas.LeftまたはCanvas.Top添付プロパティにどのようにバインドするのですか?
"Top"と "Left"というプロパティを持つ新しいUserControl
に対して、INotifyPropertyChanged
を実装するビューモデルがあります。ビューモデルの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);
// . . .
}
// . . .
}
は、私は手動でいくつかのビューモデルのインスタンスを作成して、テストするには、コンストラクタにこれらを渡すことで、私の
UserControl
のインスタンスを作成し、それらを左とTopプロパティを設定し、「キャンバス」にそれらを追加しました。残念ながら、追加されたコントロールはすべてCanvasの左上隅に表示され、ビューモデルのTopプロパティとLeftプロパティが正しく設定されている間、コントロールの
Canvas.GetLeft(...)
と
Canvas.GetTop(...)
を呼び出すと
NaN
が返されます。
私は間違っていますか?私は間違ったアプローチをしていますか?
私はこのquestion & answerの周りに自分のコードを置こうとしました。
編集: 実際には、これは機能します! UserControl
がビューモデルのインスタンスへの適切な参照を取得していない私のコードで間違いがありました。一度それを正しく掛けてしまえば、それはうまくいった。みんな、ありがとう!
なぜ 'Mode = TwoWay'ですか? –
私は[この質問]の答えに私の解決策の基礎を立てようとしました(http://stackoverflow.com/questions/2545394/binding-the-position-and-size-of-a-usercontrol-inside-a-canvas- in-wpf)、これは基本的に私が 'XAML'で望むものを実装していると思います。彼らは、 'TwoWay'モードは、ユーザがキャンバス内でコントロールを動かすとデータソース(私のビューモデル)が更新されることを可能にしていると述べました(結局私はこれらをドラッグ可能にするつもりです)。 – Pysul
@Pysul:それはそのドラッグの実装に依存し、キャンバスのプロパティの代わりにVMを編集するだけです。 –