Привязка данных в ItemsControl к пользовательскому свойству UserControl - PullRequest
2 голосов
/ 16 июля 2010

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

У меня есть стекпанель с 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, возникает ошибка в свойстве Title:

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

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

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

1 Ответ

3 голосов
/ 16 июля 2010

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

 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, если вы действительно хотите что-то сделать при изменении свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...