将ItemsControl中的DataBinding转换为自定义UserControl属性

时间:2010-07-16 17:42:03

标签: silverlight data-binding silverlight-4.0 dependency-properties

我在数据绑定方面遇到了重大问题。

我的MainPage.xml中有一个带有ItemControl的stackpanel:

                <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.TopicListItem的类型初始值设定项引发异常。 ---&GT; System.ArgumentException:默认值类型与类型不匹配   财产

-
作为旁注:我试图不为Title属性声明DepenencyProperty,只是将它作为公共String。但是我得到了转换问题,它说我无法从System.[...].Binding转换为System.String

所以我真的尝试了很多东西。

1 个答案:

答案 0 :(得分: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