Dot-Net
將 WPF 畫布子項綁定到 ObservableCollection
在我的 WPF 應用程序中,我有一個畫布,我在其中進行一些繪圖。之前我在後面的程式碼中處理了繪圖,但現在我已經將所有內容都分解到了 ViewModel 中。這給了我一些挑戰..
我有一些 InkPresenter 對象持有 Strokes。早些時候,我在後面的程式碼中將它們作為子項添加到畫布中 - 如下所示:
// 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。我可以以某種方式使用數據綁定來實現這一點嗎?
我認為您可以使用ItemsControl + ItemsPanelTemplate來做到這一點。像這樣:
<ItemsControl ItemsSource="{Binding YourCollection}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl>要了解有關此方法的更多資訊,請參閱 Dr.WPF:ItemsControl:A 到 Z (P 代表 Panel)
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> </ItemsControl>順便說一句,在我嘗試了 Anvaka 的建議後,我找到了這個問題的解決方案,但綁定不起作用。
希望這可以幫助其他人,尋找相同的答案。