Я связываю холст с ObservableCollection. Мне нужен заголовок с TextBlock с заголовком и прямоугольниками по всему холсту в разных местах. Когда пользователь нажимает на Canvas, в позиции указателя мыши добавляется новый прямоугольник.
Поскольку мне были нужны заголовок и элементы, я использовал HeaderedItemsControl. Заголовок отображается нормально. Прямоугольник добавлен на холст, но его левый и верхний не установлены в заданном месте привязки. Вместо этого он складывает прямоугольники с вертикальной ориентацией, что, как я полагаю, является поведением по умолчанию HeaderedItemsControl.
XAML -
<HeaderedItemsControl Grid.Column="1" ItemsSource="{Binding Units}">
<HeaderedItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Canvas.Left="{Binding Position.X}" Canvas.Top="{Binding Position.Y}"
Width="100" Height="70"/>
</DataTemplate>
</HeaderedItemsControl.ItemTemplate>
<HeaderedItemsControl.Header>
<TextBlock Text="{Binding Title}" />
</HeaderedItemsControl.Header>
<HeaderedItemsControl.Template>
<ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
<Canvas Background="Transparent" MouseLeftButtonDown="CanvasMouseDown" Cursor="IBeam" >
<ContentPresenter Content="{TemplateBinding Header}" />
<ItemsPresenter >
</ItemsPresenter>
</Canvas>
</ControlTemplate>
</HeaderedItemsControl.Template>
</HeaderedItemsControl>
C # Код позади -
private void CanvasMouseDown(object sender, MouseButtonEventArgs e)
{
Point position = Mouse.GetPosition(e.Source as Canvas);
MVVM.MainView.Units.Add(
new MVVM.UnitViewModel(
new MVVM.UnitModel(), position.X, position.Y));
}
Просмотр модели -
public class UnitViewModel : WorkspaceViewModel
{
private UnitModel _unitModel;
private System.Windows.Point _point;
internal UnitViewModel(UnitModel unitModel, double x, double y)
{
this._unitModel = unitModel;
_point.X = x;
_point.Y = y;
}
public System.Windows.Point Position
{
get { return _point; }
}
}
Как вы думаете, в чем проблема?