将WPF Canvas子项绑定到ObservableCollection

时间:2010-02-23 11:36:07

标签: .net wpf data-binding observablecollection

在我的WPF应用程序中,我有一个Canvas,其中我做了一些绘图。之前我在后面的代码中处理了绘图,但现在我已经将所有内容都考虑在了ViewModel上。这给了我一些挑战..

我有几个持有笔划的InkPresenter对象。我在后面的代码中将它们作为子项添加到Canvas中 - 就像这样:

// Build an InkPresenter: 
var someInkPresenter = BuildInkPresenter(..); 
//_myCanvas is the <Canvas> I want to display it in: 
_myCanvas.Children.Add(someInkPresenter); 

现在 - 没有在持有_myCanvas的XAML的代码隐藏中构建InkPresenter我需要以不同的方式执行此操作。我想做的是创建一个InkPresenter并将其添加到集合中:

public ObservableCollection<InkPresenter> Drawings;

我现在的问题是如何将Canvas绑定到此ObservableCollection - 并在添加到集合时显示InkPresenters。我能以某种方式使用数据绑定来实现这一目标吗?

2 个答案:

答案 0 :(得分:18)

我认为您可以使用ItemsControl + ItemsPanelTemplate执行此操作。像这样:

  <ItemsControl ItemsSource="{Binding YourCollection}">
    <ItemsControl.ItemsPanel>
     <ItemsPanelTemplate>
      <Canvas />
     </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
   </ItemsControl>

要详细了解此方法,请参阅Dr.WPF:ItemsControl: A to ZP is for Panel

答案 1 :(得分:14)

Anvaka建议的解决方案很棒,但正如John Bowen指出你需要了解更多,如果你想将你的项目实际绑定到Canvas附加属性。

这是一个关于如何绑定到Canvas.Left和Canvas.Top的示例:

<ItemsControl ItemsSource="{Binding YourCollection}">
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Canvas />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Setter Property="Canvas.Left" Value="{Binding YourModelLeft}" />
        <Setter Property="Canvas.Top" Value="{Binding YourModelTop}" />
    </Style>
</ItemsControl.ItemContainerStyle>

顺便说一句,在我尝试了Anvaka的建议之后,我在this question找到了解决方案,其中绑定不起作用。

希望这有助于其他人,寻找相同的答案。