【问题标题】:data Binding to periodical UserControl数据绑定到定期用户控件
【发布时间】:2013-08-29 06:13:01
【问题描述】:

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

    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 的集合中,它显示在所有 UserControl 中。 我应该怎么做才能防止这种情况发生?

【问题讨论】:

  • 这是你的用户控件背后的代码吗?
  • 我能弄清楚的唯一原因是用户控件的所有实例,而列表框的 ItemsSources 又绑定到同一个集合实例。
  • 这段代码描述了 UserControl 中的 Persons 属性
  • 为什么会这样?对于不同的控件,我还有另一个不同的属性...
  • 我已经在下面的答案中解释过了。谢谢

标签: wpf wpf-controls


【解决方案1】:

问题在于您为 Persons 设置默认值,Persons 的所有实例将共享相同的默认实例。您可以检查每个实例的哈希码。 不要将默认设置为new FrameworkPropertyMetadata(new ObservableCollection&lt;person&gt;() 将默认设置为null,如果Persons 为null,则检查UserControl 的构造函数,然后用new ObservableCollection&lt;person&gt;() 实例化它

谢谢

【讨论】:

    【解决方案2】:

    该控件正在正常工作,它显示已提供给它的Persons 的集合,即使在集合已更新之后也是如此。

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

     var copy = new ObservableCollection<Person>(original);
     userControl1.Persons = original;
     userControl2.Persons = copy;
    
    original.Add(new Person("Me"));
    //No change in userControl2
    

    【讨论】:

    • 有点像注册属性的时候,一个新的 Persons 实例
    • new FrameworkPropertyMetadata(new ObservableCollection(), OnPersonsChanged)
    • ... 即默认值。我不会以其他方式创建 Persons
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多