2

Je rencontre un problème majeur dans la liaison de données.DataBinding dans ItemsControl à une propriété UserControl personnalisée

J'ai un StackPanel avec un ItemControl dans mon MainPage.xml:

   <StackPanel> 
        <ItemsControl x:Name="TopicList"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <local:TopicListItem Title="{Binding Title}"/> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </StackPanel> 

Puis-je brancher un objet IEnumerable à ce qui contient un objet avec la propriété Title sur elle. Il se fait dans les MainPage.xaml.cs (et je sais que la partie LINQ travaille):

var resultStories = from story in resultXML.Descendants("story") 
        select new NewsStory {...}; 

Dispatcher.BeginInvoke(() => TopicList.ItemsSource = resultStories); 

Et dans mon TopicListItem de contrôle personnalisé J'ai créé un DepenencyProperty et correspondant biens publics:

#region Title (DependencyProperty) 

    /// <summary> 
    /// Title 
    /// </summary> 
    public String Title 
    { 
     get { return (String)GetValue(TitleProperty); } 
     set { SetValue(TitleProperty, value); } 
    } 
    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.Register("Title", typeof(String), typeof(TopicListItem), 
     new PropertyMetadata(0, new PropertyChangedCallback(OnTitleChanged))); 

    private static void OnTitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((TopicListItem)d).OnTitleChanged(e); 
    } 

    private void OnTitleChanged(DependencyPropertyChangedEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion Title (DependencyProperty) 

Quand je lance cela et il essaie de régler la ItemSource une erreur se produit dans la propriété Titre:

System.TypeInitializationException: le type initialiseur pour « NewsSync.Topic ListItem a jeté une exception. ---> System.ArgumentException: Le type de valeur par défaut ne correspond pas au type de la propriété.

- Comme une note de côté
: J'ai essayé de ne pas déclarer un DepenencyProperty pour la propriété Titre et avoir juste comme une chaîne publique. Mais alors je reçois des problèmes de conversion où il est dit que je ne peux pas convertir de System.[...].Binding à System.String

Donc j'ai vraiment essayé beaucoup de choses.

Répondre

3

Ce bit est votre problème: -

public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.Register("Title", typeof(String), typeof(TopicListItem), 
    new PropertyMetadata(0, new PropertyChangedCallback(OnTitleChanged))); 

Notez le premier paramètre du constructeur PropertyMetadata est la valeur par défaut de la propriété de dépendance. Vous l'avez enregistré comme typeof(String) mais vous utilisez un Int32 (0) comme valeur initiale. Utilisez null à la place. Vous pouvez aussi utiliser: -

public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.Register("Title", typeof(String), typeof(TopicListItem), null); 

Depuis votre code lancera une exception actuellement lorsqu'une valeur est affectée à Title. Vous avez seulement besoin de spécifier un PropertyChangedCallback si vous avez réellement quelque chose à faire quand la propriété change.

+0

Cela a été difficile à cracker et je l'ai fait par accident en utilisant un changement similaire: public static readonly DependencyProperty TitleProperty = DependencyProperty.Register ("Titre", typeof (String), typeof (TopicListItem), new PropertyMetadata (null)); ' – JeroenEijkhof

+0

Merci pour la clarté que je n'avais pas réalisé cette partie sur la valeur par défaut de la propriété de dépendance. Quel chemin que je cherchais aussi: – JeroenEijkhof

Questions connexes