我有一個控制一個WPF用戶控件
類DragGrid內綁定一個ObservableCollection依賴項屬性:網格 { ... }
從原始網格繼承並能拖並調整其子元素。 我需要一個自定義的DP名爲WorkItemsProperty
結合型WorkItem
(實現INotifyPropertyChanged
)可觀察到的集合。網格中的每個元素都綁定到一個集合項目。
每當用戶在運行時動態添加新項目(無法在XAML!中聲明項目)或刪除該項目中的項目時,DragGrid上的WorkItems
DP應該更新,並且網格中的子項每個孩子代表WorkItem
收集項目)。
我的問題是如何將DP通知關於哪個子元素在網格必須除去控制,改變(「變化」是指用戶拖動的元素,或者用鼠標調整大小的話)或添加,以及我將如何確定哪個現有的孩子是需要刪除或更改的孩子。 我明白,這是在DependencyPropertyChangedCallback進來。但是,當DP屬性重新設置,而不是當收集的變化裏面的東西(如添加,刪除項目)僅被調用。所以最後,DragGrid
控件是否需要訂閱CollectionChanged事件?在什麼時候我會爲此掛鉤事件處理程序?
*編輯:: 原因首先使用網格是因爲我希望能夠保持當用戶拖動或調整大小在網格中的控制最少三角洲。控件表示時間跨度,每個網格列表示15分鐘(這是最小值)。用拇指畫布做這件事是困難的和越野車。實現DragGrid解決了我的用戶交互問題。另外,畫布不可擴展,所以時間跨度必須一直重新計算。隨着網格,我沒有問題,因爲列告訴我時間無論大小。**
喬希,謝謝你。在collectionchanged事件中,我不能添加到工作項的內部集合中,因爲.NET不允許這樣做。我想你在這裏的意思是將控件添加到網格的Children集合中。 – John 2010-05-07 07:58:00
不,實際上我的意思是將它添加到您的收藏集+網格的兒童收藏集等。我不確定您的控件是如何工作的,但顯然您正在做一些工作來管理一些項目集合。根據你的評論,這聽起來像你正在管理Grid.Children集合,所以是的,將它添加到那裏。 – 2010-05-07 12:03:10
理想情況下,您需要一個ItemsControl(或可能是一個自定義的子類,不知道沒有更好地理解您的問題),並且將WorkItems設置爲ItemsControl的子項。然後您將使用ItemsPanelTemplate來顯示項目一個網格。您可以使用DataTemplate爲工作項目生成實際的視覺效果。項目模板控件上的DataBinding,容器控件(由ItemsControl生成)和Grid將允許項目在正確的位置繪製。 – 2010-05-07 12:16:07