Dot-Net

將 WPF 畫布子項綁定到 ObservableCollection

  • July 12, 2020

在我的 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 到 ZP 代表 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 的建議後,我找到了這個問題的解決方案,但綁定不起作用。

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

引用自:https://stackoverflow.com/questions/2317713