2011-02-10 4 views
2

В настоящее время я использую Caliburn, и у меня есть следующий сценарий.Binding Canvas в Caliburn

У меня есть MultiPresenterManager, а CurrentPresenter установлен в Presenter, который содержит холст. внутри представления холста Canvas, у меня есть ContentControl с границей содержимого ({Binding Canvas}), а затем события Caliburn, подключенные к ContentControl.

Я хочу иметь возможность перемещать объекты вокруг на холсте.

мне нужно 1. Привязать холст в какой-то элемент в представлении 2. Bind событие (MouseMove, MouseDown) на холст

Я не могу показаться, чтобы получить такое поведение права.

Есть ли у кого-нибудь идеи?

ответ

4

Я бы порекомендовал совсем другой подход, который, как я полагаю, будет иметь тот же конец, которого вы желаете, но удалит любую логику управления, зависящую от ваших моделей.

Во-первых, нам понадобится модель логического представления, которая представляет объекты на холсте. Давайте притворимся, что это страны, а холст - карта. Возможно, vm будет выглядеть так:

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

Я пропустил биты INPC для простоты. Далее, наш мастер ViewModel (презентатор из вашего вопроса), может выглядеть следующим образом:

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, как обычно.