2

現在Caliburnを使用していますが、次のシナリオがあります。

MultiPresenterManagerがあり、CurrentPresenterがCanvasを含むPresenterに設定されています。Canvas Presenterビュー内に、コンテンツがバインドされたContentControl({Binding Canvas})があり、次にcaliburnのイベントがContentControlにフックされています。

キャンバス上でオブジェクトを移動できるようにしたい。

1.キャンバスをビュー内の要素にバインドします2.イベント(MouseMove、MouseDown)をキャンバスにバインドします

私はこの振る舞いを正しく理解できないようです。

誰かアイデアはありますか?

4

1 に答える 1

4

非常に異なるアプローチをお勧めします。これは、希望する目的と同じになると思いますが、ビューモデルからコントロール固有のロジックを削除します。

まず、キャンバス上のオブジェクトを表す論理ビューモデルが必要です。それが国であり、キャンバスが地図であるとしましょう。おそらく、VMは次のようになります。

public class Country : PropertyChangedBase {
    public string Name {get;set;}
    public double X {get;set;}
    public double Y {get;set;}
}

簡単にするためにINPCビットを省略しました。次に、マスタービューモデル(質問のプレゼンター)は次のようになります。

public class Map : PropertyChangedBase  {
    public ObservableCollection<Country> Countries {get;set;}    
}

国ごとにキャンバスに赤い点を配置します。その場合、対応するXAMLは次のようになります(ルート要素を省略)。

<ItemsControl ItemsSource="{Binding Countries}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Ellipse Fill="Red"
                     Width="16"
                     Height="16"
                     Canvas.Top="{Binding Y}"
                     Canvas.Left="{Binding X}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

イベントを処理する必要がある場合は、通常どおりXAMLに接続します。

于 2011-03-11T15:03:03.420 に答える