Проблема DependencyProperty PropertyChangedCallback - PullRequest
0 голосов
/ 05 мая 2011

Извините за мой английский. Я пытаюсь написать UserControl (SearchTextBox ... simmillar Firefox search textbox), который состоит из TextBox, Popup и ListBox во всплывающем окне. Мне нужно изменить ItemsSource ListBox динамически в моем приложении. Поэтому я использую DependencyProperty в UserControl:

//STextBox UserControl Code-Behind
public partial class STextBox : UserControl
{
   public static readonly DependencyProperty ItemsSourceProperty;

   static STextBox()
   {
        ItemsSourceProperty = DependencyProperty.Register("ItemsSource",   typeof(IEnumerable), typeof(STextBox),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsArrange, new PropertyChangedCallback(OnItemsSourceChanged)));
    }

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

   private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {
      STextBox c = (STextBox)d;
      c.ItemsSource = (IEnumerable)e.NewValue;
   }

Я не могу использовать привязки к ItemsSource в моем приложении, потому что два списка для моего ListBox-ItemsSource создаются на лету из записей базы данных. Я устанавливаю ItemsSource в коде: // код моего приложения

  switch (SomeIF)
        {
            case 0:
                sTextBox.ItemsSource = list1;
                break;

            case 1:
                sTextBox.ItemsSource = list2;
                break;
        }

Но ничего не случилось. Я точно знаю, что метод OnItemsSourceChanged запущен, но новое значение никогда не присваивается ItemsSource. Что я делаю не так?

1 Ответ

1 голос
/ 06 мая 2011

Не могу сказать, что мне понравилось, но это решение работает.

private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  STextBox c = (STextBox)d;
  c.OnItemsSourceChanged(e);  
}

//added overload method where I can simply set property to the control
protected virtual void OnItemsSourceChanged(DependencyPropertyChangedEventArgs e)
{
   myListBox.ItemsSource = ItemsSource;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...