我有一个表单,它使用了两次,相同的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中。 我该怎么做才能防止这种情况发生?
答案 0 :(得分:0)
控件正在正常工作,它显示已经给出的Person
集合,即使在集合更新之后也是如此。
因此答案很简单。如果要显示不同的人员集,请使用不同的集合。您可以使用
复制一个 var copy = new ObservableCollection<Person>(original);
userControl1.Persons = original;
userControl2.Persons = copy;
original.Add(new Person("Me"));
//No change in userControl2
答案 1 :(得分:0)
问题在于您为Persons设置默认值,Persons的所有实例将共享相同的默认实例。您可以检查每个实例的哈希码。
不要将默认值设置为new FrameworkPropertyMetadata(new ObservableCollection<person>()
将default设置为null,如果Persons为null,则检查UserControl的构造函数,然后使用new ObservableCollection<person>()
由于