2010-12-08 86 views
0

我目前有幾個不同的用戶控件提供了相同的功能:名爲Select All,Deselect All和Toggle Selected的三個不同按鈕。這些對每個用戶控件中實現我的ICheckable接口的項目列表執行操作。我想統一這些東西,使得命令和按鈕都只在一個地方定義 - 一個新的用戶控件 - 而不是在兩個不同的用戶控件中複製。我的問題是,在一個用戶控件中,我正在處理一個我的Template類的列表,而另一個用戶控件具有一個Defect類的列表。 TemplateDefect均實施ICheckable,這意味着全選,全部取消和切換選擇適用於它們。在UserControls之間傳遞具有不同類型參數的泛型類

我有一個通用的容器類SelectableItems<T>,需要T適合這些約束:where T : ICheckable, IEquatable<T>, IDeepCloneable<T>SelectableItems<T>提供了一個ObservableCollection<T> Items屬性,以及其他有用的屬性,如bool IsAnyItemSelected,T SelectedItem等。這些屬性將用於實現全選等命令。 TemplateDefect都適合所有這些約束條件。我將在我的新用戶控件中創建一個依賴項屬性,我將綁定來自其他用戶控件的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)?

回答

0

創建一個非通用ObservableCollection類,然後使用值轉換器將我的ObservableCollection<T>值轉換爲ObservableCollection似乎已工作。

這裏是我的ObservableCollection類的重要組成部分:

public class ObservableCollection : ICollection<object>, 
    INotifyCollectionChanged 
{ 
    private ObservableCollection<object> _collection; 

    public ObservableCollection() 
    { 
     _collection = new ObservableCollection<object>(); 
     _collection.CollectionChanged += 
      new NotifyCollectionChangedEventHandler(collectionChanged); 
    } 

    public ObservableCollection(IEnumerable items) 
    { 
     if (null == items) 
     { 
      throw new ArgumentNullException("items"); 
     } 
     _collection = new ObservableCollection<object>(); 
     foreach (object item in items) 
     { 
      Add(item); 
     } 
     _collection.CollectionChanged += 
      new NotifyCollectionChangedEventHandler(collectionChanged); 
    } 

    ...stuff necessary to implement ICollection<object>... 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    void collectionChanged(object sender, 
     NotifyCollectionChangedEventArgs e) 
    { 
     NotifyCollectionChangedEventHandler handler = CollectionChanged; 
     if (null != handler) 
     { 
      handler(this, e); 
     } 
    } 
} 

而這裏的值轉換器:

public class EnumerableToObservableCollectionConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     if (targetType != typeof(ObservableCollection)) 
     { 
      throw new ArgumentException("Do not use this converter except " + 
       "when going to ObservableCollection"); 
     } 
     var enumerable = value as IEnumerable; 
     if (null == enumerable) 
     { 
      return new ObservableCollection(); 
     } 
     return new ObservableCollection(enumerable); 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
} 

我綁定像這樣:

<local:ItemSelection SelectedItems="{Binding Path=MyViewModel.SelectedItems, 
    Mode=OneWay}" 
    Items="{Binding Path=MyViewModel.Items, Mode=OneWay, 
     Converter={StaticResource observCollConverter}}" 
    IsAnyItemSelected="{Binding Path=MyViewModel.IsAnyItemSelected, 
     Mode=OneWay}"/> 
+0

它只是發生我可能不需要編寫非泛型ObservableCollection,我可以使用轉換器來轉換`ObservableCollection `到`ObservableCollection `......好吧。 – 2010-12-09 20:54:31

相關問題