我在数据绑定方面遇到了重大问题。
我的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
所以我真的尝试了很多东西。
答案 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
。