【发布时间】:2011-09-06 02:57:14
【问题描述】:
让我解释一下我的情况。我制作了一个包含 ItemsControl 的用户控件
<ItemsControl Name="itemControlReviewTags">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<my:ReviewControl ReviewEvent="{Binding}" />
<TextBlock Text="{Binding Text}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这个 ItemsControl 绑定到后面代码中的一个 observablecollection
public ObservableCollection<TagEvent> tagItems = new ObservableCollection<TagEvent>();
像这样在 ItemsControl 上设置集合
itemControlReviewTags.ItemsSource = tagItems;
TagEvent 类的定义如下。该类会在某些事件中添加到集合中。
public class TagEvent : EventArgs
{
public string Text { get; set; }
public string Comment { get; set; }
public string Value { get; set; }
public DateTime Time { get; set; }
public string Type { get; set; }
}
数据模板中的 ReviewControl 有一个像这样的 DependencyProperty
public TagEvent ReviewEvent
{
get
{
return (TagEvent)GetValue(ReviewEventProperty);
}
set
{
SetValue(ReviewEventProperty, value);
}
}
public static readonly DependencyProperty ReviewEventProperty = DependencyProperty.Register("ReviewEvent", typeof(TagEvent), typeof(ReviewControl), new PropertyMetadata(new TagEvent() { Comment = "hallo", Text = "De tag", Time = DateTime.Now, Type = "Mark", Value = "Mark" }, ReviewEvent_PropertyChangedCallback));
private static void ReviewEvent_PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ReviewControl reviewControl = (ReviewControl)d;
reviewControl.LoadReviewEvent();
}
奇怪的是,当我运行我的程序时,TagEvents 会添加到集合中,而 ItemsControl 会显示每个项目的数据模板。我用来验证 TagEvents 属性值的测试块显示了 text 属性的正确值。但是在 ReviewEvent Dependency 属性中,我只得到“空”对象(所有值都是空字符串或默认日期)。这些对象替换了默认值,因为我可以将其视为 DP 回调中的旧值。
我可以理解 ItemsControl 不显示项目,但为什么它显示的项目看起来像是在为集合中的每个项目执行“新 TagEvent”,这超出了我的理解。希望这里有人对我有建议。我尝试在 TagEvent 上实现 INotifyPropertyChanged,但这似乎并没有改变任何东西。我可以拆分 TagEvent 类的属性,但是当我可以传递对象时,我不明白为什么必须这样做。
帮助?
【问题讨论】:
标签: silverlight binding datatemplate observablecollection