首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据绑定到期刊UserControl

数据绑定到期刊UserControl
EN

Stack Overflow用户
提问于 2013-08-29 06:13:01
回答 2查看 64关注 0票数 1

我有一个表单,它被使用了两次,同一个UserControl。UserControl有一个ListBox,它使用DependencyProperty作为ItemSource(ItemsSource=“{bindingPath=Persons,ElementName=ThisControl})。

代码语言:javascript
复制
    public static readonly DependencyProperty PersonsProperty = DependencyProperty.Register
        (
             "Persons",
             typeof(ObservableCollection<person>),
             typeof(Control),
             new FrameworkPropertyMetadata(new ObservableCollection<person>(), OnPersonsChanged)
        );

    public ObservableCollection<person> Persons
    {
        get { return (ObservableCollection<person>)GetValue(PersonsProperty); }
        set { SetValue(PersonsProperty, value); }
    }

    private static void OnPersonsChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var me = sender as Control;
        var old = e.OldValue as ObservableCollection<person>;
        if (old != null) old.CollectionChanged -= me.OnCollectionChanged;
        var n = e.NewValue as ObservableCollection<person>;
        if (n != null) n.CollectionChanged += me.OnCollectionChanged;
    }

    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Reset)
        {
            Persons.Clear();
        }

        if (e.NewItems != null)
        {
            foreach (person item in e.NewItems)
            {
                item.PropertyChanged += OnPersonChanged;
            }
        }

        if (e.OldItems != null)
        {
            foreach (person item in e.OldItems)
            {
                item.PropertyChanged -= OnPersonChanged;
            }
        }
    }

    private void OnPersonChanged(object sender, PropertyChangedEventArgs e)
    {
    }

这个UserControl多次使用。这导致元素被添加到一个UserControl的集合中,它显示在所有UserControls中。我该怎么做才能防止这种情况发生?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-29 06:55:52

问题是在何处设置Person的默认值,Person的所有实例都将共享相同的默认实例。您可以检查每个实例的哈希代码。不要将默认设置为new FrameworkPropertyMetadata(new ObservableCollection<person>()设置为null,如果Person为null,则签入UserControl的构造函数,然后使用new ObservableCollection<person>()实例化它

谢谢

票数 0
EN

Stack Overflow用户

发布于 2013-08-29 06:25:48

该控件正在正确地执行它的工作,它显示给定的Persons集合,即使在更新集合之后也是如此。

因此,答案很简单。如果要显示不同的人员集,请使用不同的集合。您可以通过以下方式复制一个

代码语言:javascript
复制
 var copy = new ObservableCollection<Person>(original);
 userControl1.Persons = original;
 userControl2.Persons = copy;

original.Add(new Person("Me"));
//No change in userControl2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18503490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档