0

MVVM パターンを使用して WPF アプリケーションを開発しています。私のアプリケーションには、いくつかの異なる形状を表示するキャンバスがあります。これらの形状は、倉庫 (別名ストレージ) と倉庫の内容を表します。

倉庫 ( で記述されているObservableCollection<Point>) のみを表示するには、次のコード スニペットを使用します。

    <Canvas Width="{Binding StorageWidth, Mode=OneWay}" Height="{Binding StorageHeight, Mode=OneWay}">
     <Polygon Points="{Binding StorageVertices, Mode=OneWay, Converter={StaticResource PointCollectionConverter}}" Stroke="Gray" StrokeThickness="30">
      <Polygon.Fill>
       <SolidColorBrush Color="DarkRed" Opacity="0.25" />
      </Polygon.Fill>
     </Polygon>
    </Canvas>

このキャンバスに、長方形 (ストレージ内のオフィスを表すため) と円 (ストレージ内のノードを表すため) を追加します。これらは私のビューモデルで定義されています:

class Node
{
 // ...
 Point Position { get; private set; }
}

class Office
{
 // ...
 ObservableCollection<Point> Vertices { get; private set; }
}

public class ViewModel : ViewModelBase
{
 // ...
 ObservableCollection<Node> Nodes { get; private set; }
 ObservableCollection<Office> Offices { get; private set; }

 ObservableCollection<Point> StorageVertices { get; private set; } // Already displayed on the canvas
}

これらをデータ バインディングを使用してストレージ領域と一緒にキャンバスに表示するにはどうすればよいですか? 通常どおり使用できたことはわかっていItemsControlますが、今ではいくつかの異なるコレクション/ソースがあり、それらはさまざまな方法で記述されることになっています ( Nodes はCirclesですが、 Offices はRectangles です)。

4

1 に答える 1

1

1 つのキャンバスを複数の ItemsControl の ItemsPanel として使用することはできないため、それらを 1 つのリスト (少なくともノードとオフィス) にする方法を見つけることができます。それらの抽象化を見つけようとするか、代わりに Object を使用してください。

これで、ストレージを持つ ObservableCollection ができました。Canvas で ItemsControl を ItemsPanel として DataTemplate を使用して使用し、その上にすべてのノードとオフィスを描画できます。次はストレージの追加です。あなたには2つの選択肢があると思います.おそらく他の人はそれをリストに入れて別のDataTemplateを追加するか、カスタマイズしたキャンバスを記述して、ストレージにバインドするための依存関係プロパティを公開し、OnManipulationDeltaメソッドをオーバーライドします. 率直に言って、2 番目に試したことがなく、うまくいくとは言えませんが、詳細については、この記事を参照してください。 -itemspanel-for-an-itemscontrol.aspx

それが役立つことを願っています。

于 2013-07-09T13:04:49.827 に答える