Как сделать привязку данных свойства пользовательского элемента управления Silverlight? - PullRequest
3 голосов
/ 28 мая 2009

Я создал пользовательский элемент управления Silverlight, который состоит из двух сборщиков даты и комбинированного списка. Я хотел бы сделать привязку данных комбинированного списка, и я знаю, что мне нужно использовать свойство DependencyProperty. В чем я не уверен, так это в том, как его построить. Вот код, который у меня есть:

#region ItemsSource (DependencyProperty)

    /// <summary>
    /// ItemsSource to bind to the ComboBox
    /// </summary>
    public IList ItemsSource
    {
        get { return (IList)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }
    public static readonly DependencyProperty ItemsSourceProperty =
        DependencyProperty.Register("ItemsSource", typeof(int), typeof(DateRangeControl),
          new PropertyMetadata(0));

    #endregion

Проблема в том, что все примеры, которые я видел, предназначены для простых свойств, таких как Text или Background, которые ожидают либо строку, либо int, либо цвет. Так как я пытаюсь привязать к combobox ItemsSource, он ожидает IEnumerable, я не знал, как построить свойство для этого. Я использовал IList.

Может кто-нибудь сообщить мне, если я на правильном пути, и дать мне несколько советов? Спасибо

Ответы [ 2 ]

3 голосов
/ 01 июня 2009

Я вижу проблему с кодом, который вы разместили. Инспектор доступа и тип, определенный в вашей регистрации DP, должны быть согласованы. Ваш существующий код должен работать, если вы измените typeof (int) на typeof (IList).

Но обычно рекомендуется использовать тип самого низкого уровня, который удовлетворяет требованиям свойства. Исходя из этого, если вы хотите создать свойство коллекции, используйте IEnumerable, если вам действительно не нужна функциональность, предоставляемая IList.

1 голос
/ 29 мая 2009

Разве вы не можете просто использовать это?

        public IEnumerable ItemsSource
    {
        get
        {
            return (IEnumerable)GetValue(ItemsSourceProperty);
        }
        set
        {
            SetValue(ItemsSourceProperty, value);
        }
    }

    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(DateRangeControl), new PropertyMetadata(null));

IEnumerable можно найти в System.Collections.Generic

...