在我的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。我能以某种方式使用数据绑定来实现这一目标吗?
答案 0 :(得分:18)
我认为您可以使用ItemsControl + ItemsPanelTemplate执行此操作。像这样:
<ItemsControl ItemsSource="{Binding YourCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
要详细了解此方法,请参阅Dr.WPF:ItemsControl: A to Z(P 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找到了解决方案,其中绑定不起作用。
希望这有助于其他人,寻找相同的答案。