UIElement
ビューモデルがコレクション内の別のビュー モデルと同じプロパティを持っている場合、そのビュー モデルは間違ったものにバインドされます。
マトリックスをCanvas
表すコントロールがあり、このキャンバスは四角形のビュー モデルのコレクションにバインドされています。各四角形のビュー モデルは、モデルの座標を設定する Move() メソッドを持つモデルに関連しています。このメソッドは、マトリックス (x,y) 上のどこに移動するかを四角形に伝えます。
public class RectangleModel
{
public void Move()
{
// Logic to find out where to move
// sets x,y coordinates for the model
this.Location.X = x;
this.Location.Y = y
}
}
Canvas View Model には DispatcherTimer があり、実行時にキャンバスの ObservableCollection 内のすべての四角形ビュー モデルをループし、MoveModel() メソッドを呼び出します。このメソッドは、参照する四角形モデルの Move メソッドを呼び出します。
public class CanvasViewModel
{
private void MoveAllRectangles()
{
for(int i = 0; i < obsCol.Size; i++)
{
obsCol[i].MoveModel();
}
}
public class RectangleViewModel
{
private RectangleModel InstanceModel
{
get{ return this.instanceModel; }
set{ this.instanceModel = value;}
}
public int XPos
{
get
{
return this.InstanceModel.Location.X;
}
}
public int YPos
{
get
{
return this.InstanceModel.Location.Y;
}
}
public void MoveModel()
{
this.InstanceModel.Move();
NotifyOfPropertyChange(string.Empty);
}
}
これは正常に機能し、キャンバス上のすべての長方形がマトリックス上の隣接するタイルに毎秒移動します。つまり、四角形が別の四角形 (同じ XPos、YPos プロパティを持つビュー モデル) によって既に占有されているタイルに移動するまでです。これが発生すると、両方の四角形が同じビュー モデルにバインドされ (そのように見えます)、タイマーが両方の四角形を実行します。同じ場所に移動します。したがって、キャンバス上で 5 つの長方形から始めた場合、最終的にはすべてが結合され、1 つの長方形だけがキャンバス上を移動するようになります。
問題をデバッグすると、四角形が正しく動き回ります。四角形が別の四角形タイルに入った場合、次回の反復では、四角形は単純にタイルの外に移動し、正しく続行されます。
どんな助けでも大歓迎です。