2010-06-28 3 views
3

У меня есть свойство canvas в моем классе, и мне было интересно, можно ли связать это с холстом в xaml?Binding to Canvas

Как будет работать привязка данных на холсте?

<Canvas ItemSource="{Binding ClassCanvas}" /> 
+0

Просьба предоставить более подробную информацию. – SLaks

+0

Я обновил свой вопрос. – Robert

ответ

3

Если вы хотите, чтобы ваш Canvas определен в XAML, чтобы включить весь холст в своем классе в качестве отдельного элемента вы можете написать:

<Canvas> 
    <ContentPresenter Content="{Binding ClassCanvas}" /> 
    ... other items here ... 
</Canvas> 

Если вы хотите, чтобы ваш Canvas определен в XAML, чтобы включить все же UiElements как Canvas, определенный в вашем классе, невозможно, потому что UIElement может иметь только один родитель UIElement. Поэтому, если Canvas, определенный в классе, является родительским элементом данного UIElement, Canvas, определенный в XAML, не может быть.

Если вы хотите, чтобы ваш Canvas для отображения данных из каждой UIElement в Canvas, определенные в классе, вы можете сделать это с помощью ItemsControl с Canvas панелью и DataTemplate:

<ItemsControl ItemsSource="{Binding ClassCanvas.Children}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas /> 
    </ItemsPanelTemplate> 
    </ItemsControl> 
    <ItemsControl.ItemsContainerStyle> 
    <Style> 
     <Setter Property="Canvas.Left" Value="{Binding (Canvas.Left)}" /> 
     <Setter Property="Canvas.Left" Value="{Binding (Canvas.Top)}" /> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
      ... display of UIElement here, either using VisualBrush or custom display 
      </ControlTemplate> 
     <Setter.Value> 
     </Setter> 
    </Style> 
    </ItemsControl.ItemsContainerStyle> 
</ItemsControl> 

Следует заметить, что этот код будет только сканирование свойства «Дети» один раз, поскольку это не коллекция INotifyCollectionChanged.

Если вы хотите связать свойство в своем классе, которое содержит коллекцию UIElements с установленными свойствами Canvas.Top и Canvas.Left, вы можете легко сделать это, если контейнер представляет собой ObservableCollection вместо Canvas.

Класс Canvas никогда не был предназначен для использования в вашем слое данных. Я настоятельно рекомендую вам переключиться на использование ObservableCollection и использовать Canvas только как часть вашего представления.

0

Да.

Вы можете привязать к холсту или любому другому объекту.

+0

Итак, у меня может быть объект canvas в моем классе и связать это с холстом в xaml? Как будет работать привязка данных? Могу ли я добавить детей в холст в классе и что изменится в xaml? – Robert

+0

Вы можете установить объект 'Canvas' на свой класс, чтобы ссылаться на холст в вашем XAML. – SLaks