2011-05-05 3 views
0

Désolé pour mon anglais. J'essaie d'écrire UserControl (SearchTextBox ... simmillar Firefox searchbox) qui se compose de TextBox, Popup et ListBox dans un popup. J'ai besoin de changer ItemsSource de ListBox dynamiquement dans mon application. Donc, j'utilise DependencyProperty dans UserControl:DependencyProperty PropertyChangedCallback problème

//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; 
    } 

Je ne peux pas utiliser les liaisons à ItemsSource dans mon application, parce que deux listes pour mon ListBox-ItemsSource crée à la volée à partir des dossiers de base de données. Je mis ItemsSource dans le code: // mon application code-behind

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

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

Mais rien ne se produisit. Je sais exactement que la méthode OnItemsSourceChanged est déclenchée, mais une nouvelle valeur n'a jamais été affectée à ItemsSource. Qu'est ce que je fais mal?

+1

Comment utilisez-vous la propriété ItemsSource de votre UserControl? Est-ce que vous liez quelque part? –

+0

Non, je n'utilise pas les liaisons de mon UserControl – mirymir

+0

Alors qu'est-ce que vous attendez de vous lorsque vous affectez ItemsSource? Si cette propriété n'est utilisée nulle part, bien sûr rien ne se passera ... Vous devez probablement le lier à la propriété ItemsSource de ListBox. –

Répondre

1

Je ne peux pas dire que j'ai aimé, mais cette solution fonctionne.

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; 
} 
Questions connexes