【问题标题】:Silverlight: binding object collection to datatemplate in itemscontrols binds empty objects to propertySilverlight:将对象集合绑定到项目控件中的数据模板将空对象绑定到属性
【发布时间】: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


    【解决方案1】:

    我现在可以回答我自己的问题了。我有一个语句在我忘记的代码隐藏中设置用户控件的数据上下文。它把事情搞砸了。

    永远不要把旧代码放在...

    【讨论】:

    • 只接受你自己的答案:点击答案左侧的 V 符号。
    最近更新 更多