绑定到画布

3

我在我的类中有一个canvas属性,我想知道是否可以将其绑定到xaml中的canvas?

在canvas中,数据绑定应该如何工作?

<Canvas ItemSource="{Binding ClassCanvas}" />
2个回答

3
如果您想在XAML中定义的Canvas将整个Canvas作为单个项目包含在类中,可以编写以下内容:
<Canvas>
  <ContentPresenter Content="{Binding ClassCanvas}" />
  ... other items here ...
</Canvas>

如果你希望在XAML中定义的Canvas包含与类中定义的Canvas相同的UI元素,这是不可能的,因为一个UI元素只能有一个UI元素父级。所以如果类中定义的Canvas是给定UI元素的父级,那么XAML中定义的Canvas就无法成为其父级。

如果你想让Canvas显示来自类中定义的Canvas中每个UI元素的数据,你可以使用一个带有Canvas面板和DataTemplate的ItemsControl实现此功能:

<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集合。
如果您想绑定到类中包含UIElement集合的属性,并设置了它们的Canvas.Top和Canvas.Left属性,如果容器是ObservableCollection而不是Canvas,则可以轻松实现此目标。
Canvas类从未设计用于数据层。 我强烈建议您切换到在那里使用ObservableCollection,并将Canvas仅用作视图的一部分。

0

可以。

你可以绑定到画布或任何其他对象。


所以我可以在我的类中拥有一个画布对象,并将其绑定到xaml中的画布?那么数据绑定会如何工作?我可以在类中添加子元素,这样在xaml中就会发生变化吗? - Robert
你可以在类中设置 Canvas 对象来引用 XAML 中的画布。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接