我应该如何在UserControl上公开集合?

时间:2011-02-12 09:27:41

标签: silverlight data-binding silverlight-4.0 binding observablecollection

我正在创建一个将在各种场景中使用的UserControl。我需要从UserControl公开一个字符串集合,我不知道该怎么做。

我看到的两种可能用途是:

  • 对其含有对照的控制与该集合结合,例如一个ListBox;
  • 包含控件的ViewModel上的属性需要绑定到集合。

我可以让前者使用公共ObservableCollection< String> UserControl上的属性,但它不适用于后者。 (我得到“对象类型'System.Windows.Data.Binding'无法转换为类型'System.Collections.ObjectModel.ObservableCollection`1 [System.String]'。”)

是否有适合两者的解决方案?

修改

这是我在UML图表上的示意图,显示了我正在做的事情:

a uml diagram

2 个答案:

答案 0 :(得分:2)

我认为问题只在于活页夹无法理解泛型。您应该能够通过继承ObservableCollection<string>来制作非泛型类来解决这个问题。你可以使用这样的东西:

class StringCollection : ObservableCollection<string> { }

由于您使用该属性作为绑定的目标,因此必须将其声明为DependencyProperty:

class ObjectSelectorView
{
    public StringCollection ObjectNames
    {
        get { return (StringCollection)GetValue(ObjectNamesProperty); }
        set { SetValue(ObjectNamesProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ObjectNames.
    // This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ObjectNamesProperty = 
        DependencyProperty.Register("ObjectNames", typeof(StringCollection),
            typeof(ObjectSelectorView), null);
   ....
}

答案 1 :(得分:1)

我建议您看到的错误实际上是您未将此属性实现为依赖项属性的结果。你应该在这里使用依赖属性。

不要将控件上的属性公开为具体的ObservableCollection。而是将属性公开为简单的非泛型IList

在控件的构造函数中为此属性分配一个ObservableCollection<String>的初始空实例。但是,该属性应该具有公共setter,因此您的初始集合实例可能会被IList的其他实现者替换。因此,如果当前实例没有您可能需要的其他接口,则应在内部将此属性的使用限制为IList或正常降级行为。