2

У меня серьезная проблема в привязке данных.DataBinding в ItemsControl к пользовательскому свойству UserControl

У меня есть StackPanel с ItemControl в моем MainPage.xml:

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

Тогда я зацепить IEnumerable объект на том, что, который содержит объект со свойством Title на нем. Это делается в MainPage.xaml.cs (и я знаю, что LINQ часть работает):

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

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

А внутри моего пользовательского элемента управления TopicListItem Я создал DepenencyProperty и соответствующую общественную собственность:

#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) 

Когда я запускаю это и пытается установить ItemSource ошибка появляется на свойстве Название:

System.TypeInitializationException: тип инициализатора для «NewsSync.Topic ListItem выбрасывает исключение. ---> System.ArgumentException: Тип значения по умолчанию не соответствует типу свойства.

-
В качестве примечания: Я пытался не объявляя DepenencyProperty для свойства Title и просто иметь его в качестве публичной String. Но потом я получаю конверсионные вопросы, где говорится, что я не могу конвертировать из System.[...].Binding в System.String

Так что я действительно много пробовал.

ответ

3

Этот бит ваша проблема: -

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

Обратите внимание на первый параметр PropertyMetadata конструктора по умолчанию значение свойства зависимостей. Вы зарегистрировали его как typeof(String), но в качестве начального значения вы используете Int32 (0). Вместо этого используйте null. Вы также можете просто использовать: -

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

Поскольку ваш код будет сгенерировано исключение в настоящее время, когда значение присваивается Title. Вам нужно указать только PropertyChangedCallback, если у вас есть что-то, что нужно делать, когда изменяется свойство.

+0

Это было сложно взломать, и я сделал это случайно с помощью аналогичного изменения: 'public static readonly DependencyProperty TitleProperty = DependencyProperty.Register (" Title ", typeof (String), typeof (TopicListItem), new PropertyMetadata (null)); ' – JeroenEijkhof

+0

Спасибо за ясность, что я не понял эту часть о значении по умолчанию свойства зависимостей. Который, кстати, я тоже искал: D – JeroenEijkhof

Смежные вопросы