2010-02-23 189 views
10

在我的WPF應用程序中,我有一個Canvas,在其中繪製一些圖形。早些時候,我在後面的代碼中處理了繪圖,但現在我已將所有事情都考慮到了ViewModel。這給我一些挑戰..將WPF Canvas子項綁定到ObservableCollection

我有幾個InkPresenter對象持有筆畫。 Earier我加入他們的孩子到畫布後面的代碼 - 這樣的:

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

我的問題是如何將畫布綁定到這個的ObservableCollection - 並有當添加到集合中的InkPresenters顯示。我可以使用數據綁定以某種方式實現這一點嗎?

回答

16

我想你可以用ItemsControl + ItemsPanelTemplate做到這一點。就像這樣:

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

想了解更多關於這種方法是指Dr.WPF:ItemsControl: A to ZP is for Panel

+0

Thx!聽起來很合理。將看看它! – stiank81 2010-02-23 11:56:40

+1

這通常是您要採取的方法,但在這種情況下您可能會遇到問題,因爲InkPresenter不會像Canvas那樣直接作爲子代,就像它們在代碼中添加它們時一樣。相反,Visual Tree將在每個InkPresenter項目周圍注入一個額外的ContentPresenter。爲了使這種方法起作用,您應該查看每個InkPresenter的實際數據(Strokes),並將這些數據存儲在您的VM中。然後,您可以創建一個覆蓋GetContainerForItemOverride以返回InkPresenter的自定義ItemsControl。 – 2010-02-23 17:17:04

+0

不能同意你約翰...這是一個ItemsControl。它使用UIElement作爲默認容器... – Anvaka 2010-02-23 17:46:05

10

Anvaka提出的解決方案是偉大的,但約翰·博文指出,你需要知道的多一點,如果你想實際將你的項目綁定到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> 

順便說一句,我找到了解決辦法上this question後,我試圖Anvaka的建議,其中結合不工作。

希望這可以幫助他人,尋找相同的答案。

+0

謝謝,正是我在找的東西。 – Cousken 2016-05-12 10:56:08

相關問題