Привязка к холсту - PullRequest
       16

Привязка к холсту

3 голосов
/ 28 июня 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

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

<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>

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

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

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

0 голосов
/ 28 июня 2010

Да.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...