2010-06-28 6 views
3

J'ai une propriété canvas dans ma classe et je me demandais s'il était possible de lier cela à une toile dans xaml?Liaison à Canvas

Comment la liaison de données fonctionnerait-elle dans le canevas?

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

Veuillez fournir plus de détails. – SLaks

+0

J'ai mis à jour ma question. – Robert

Répondre

3

Si vous voulez que votre toile défini dans XAML pour inclure toute la toile dans votre classe comme un seul article, vous pouvez écrire:

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

Si vous voulez que votre toile défini dans XAML pour inclure tous les mêmes UIElements que le Canevas défini dans votre classe, il est impossible car un UIElement ne peut avoir qu'un seul parent UIElement. Ainsi, si le canevas défini dans la classe est le parent d'un UIElement donné, le canevas défini dans XAML ne peut pas l'être.

Si vous voulez que votre toile pour afficher les données de chaque UIElement dans le Canevas définis dans votre classe, vous pouvez le faire avec un ItemsControl avec un panneau de toile et un 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> 

Notez que ce code analyser uniquement la propriété Children une seule fois car il ne s'agit pas d'une collection INotifyCollectionChanged.

Si vous souhaitez lier à une propriété de votre classe qui contient une collection de UIElements avec leurs propriétés Canvas.Top et Canvas.Left, vous pouvez facilement le faire si le conteneur est un ObservableCollection au lieu d'un Canvas.

La classe Canvas n'a jamais été conçue pour être utilisée dans votre couche de données. Je vous recommande fortement d'utiliser un ObservableCollection et d'utiliser uniquement Canvas dans le cadre de votre vue.

0

Oui.

Vous pouvez lier à un canevas ou à tout autre objet.

+0

Donc, je peux avoir un objet canvas dans ma classe et le lier à la toile dans le xaml? Comment la liaison de données fonctionnerait-elle là-dessus? Puis-je ajouter des enfants à la toile dans la classe et cela changerait dans le xaml? – Robert

+0

Vous pouvez définir l'objet 'Canvas' sur votre classe pour faire référence à la toile dans votre XAML. – SLaks