我目前有幾個不同的用戶控件提供了相同的功能:名爲Select All,Deselect All和Toggle Selected的三個不同按鈕。這些對每個用戶控件中實現我的ICheckable
接口的項目列表執行操作。我想統一這些東西,使得命令和按鈕都只在一個地方定義 - 一個新的用戶控件 - 而不是在兩個不同的用戶控件中複製。我的問題是,在一個用戶控件中,我正在處理一個我的Template
類的列表,而另一個用戶控件具有一個Defect
類的列表。 Template
和Defect
均實施ICheckable
,這意味着全選,全部取消和切換選擇適用於它們。在UserControls之間傳遞具有不同類型參數的泛型類
我有一個通用的容器類SelectableItems<T>
,需要T
適合這些約束:where T : ICheckable, IEquatable<T>, IDeepCloneable<T>
。 SelectableItems<T>
提供了一個ObservableCollection<T> Items
屬性,以及其他有用的屬性,如bool IsAnyItemSelected
,T SelectedItem
等。這些屬性將用於實現全選等命令。 Template
和Defect
都適合所有這些約束條件。我將在我的新用戶控件中創建一個依賴項屬性,我將綁定來自其他用戶控件的SelectableItems<Template>
和SelectableItems<Defect>
屬性。儘管如此,我不認爲有可能實現通用的依賴項屬性,因爲我使用XAML後不能使用通用的UserControl
類。我應該怎麼做呢?我使用.NET 3.5。
綜上所述,這就是我想要的:
TemplateList user control ItemSelection user control
------------------------------------------- --------------------------
SelectableItems<Template> TemplateContainer ==Bind==> unknownType? ItemContainer
DefectList user control ItemSelection user control
--------------------------------------- --------------------------
SelectableItems<Defect> DefectContainer ==Bind==> unknownType? ItemContainer
編輯:我認爲只是增加依賴屬性到我的新ItemSelection
用戶控制在SelectableItems<T>
視圖模型的所有有用的屬性,如IsAnyItemSelected
等。這對大多數物業來說都沒問題,但是我很猶豫要爲ObservableCollection<T> Items
做這件事,因爲我遇到了上述同樣的一般問題,而且我不信任事情能夠正常工作,如果我只是使用IEnumerable
而不是ObservableCollection<something>
。也許我應該製作一個不通用的ObservableCollection
類(如this question)?
它只是發生我可能不需要編寫非泛型ObservableCollection,我可以使用轉換器來轉換`ObservableCollection`到`ObservableCollection