Как мне выставить коллекцию на UserControl? - PullRequest
1 голос
/ 12 февраля 2011

Я создаю UserControl, который будет использоваться в различных сценариях. Мне нужно выставить коллекцию строк из UserControl, и я не уверен, как это сделать.

Я вижу два возможных варианта использования:

  • элемент управления содержащего его элемента управления связывается с коллекцией, например, a ListBox;
  • свойство в ViewModel содержащего элемента управления должно быть привязано к коллекции.

Я могу заставить первое работать с открытым свойством ObservableCollection в UserControl, но оно не будет работать для второго. (Я получаю "Объект типа 'System.Windows.Data.Binding' не может быть преобразован в тип 'System.Collections.ObjectModel.ObservableCollection`1 [System.String]'.")

Есть ли решение, которое будет работать для обоих?

РЕДАКТИРОВАТЬ

Это мой удар по UML-диаграмме, показывающей, что я делаю:

a uml diagram

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Я думаю, что проблема только в том, что связующее не может понять дженерики. Вы должны быть в состоянии обойти это, наследуя от 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 голос
/ 12 февраля 2011

Я бы предположил, что ошибка, которую вы видите, на самом деле является результатом того, что вы не реализовали это свойство как свойство зависимости.Здесь вы должны использовать свойство зависимости.

Не открывайте свойство в вашем элементе управления как конкретную коллекцию ObservableCollection чего-либо.Вместо этого выставьте свойство как простой неуниверсальный IList.

. В конструкторе вашего элемента управления присвойте этому пустому начальному экземпляру ObservableCollection<String>.Однако у свойства должен быть общедоступный установщик, и поэтому ваш первоначальный экземпляр коллекции может быть заменен каким-либо другим реализатором IList.Поэтому вам следует ограничить внутреннее использование этого свойства IList или изящно ухудшить поведение, если в текущем экземпляре нет других интерфейсов, которые вам могут понадобиться.

...