我有ObservableCollection
使用RichTextBox
行为:
public ObservableCollection<SendContent> RtbContent
{
get { return (ObservableCollection<SendContent>)GetValue(RtbContentProperty); }
set { SetValue(RtbContentProperty, value); }
}
// Using a DependencyProperty as the backing store for RtbContent. This enables animation, styling, binding, etc...
public static readonly DependencyProperty RtbContentProperty =
DependencyProperty.Register("RtbContent",
typeof(ObservableCollection<SendContent>),
typeof(RTBBehavior),
new UIPropertyMetadata(new ObservableCollection<SendContent>(), new PropertyChangedCallback(RtbContentPropertyChanged)));
public RTBBehavior()
{
SetValue(RtbContentProperty, new ObservableCollection<SendContent>());
}
private static void RtbContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs er)
{
NotifyCollectionChangedEventHandler handler= (s, e) => coll_CollectionChanged(s, e, d);
if (er.NewValue !=null)
{
var coll = (ObservableCollection<SendContent>)er.NewValue;
coll.CollectionChanged += handler;
}
if (er.OldValue !=null)
{
var coll = (ObservableCollection<SendContent>)er.OldValue;
coll.CollectionChanged -= handler;
}
}
private static void coll_CollectionChanged(object se, NotifyCollectionChangedEventArgs en, DependencyObject dob)
{
PropertyChangedEventHandler handler = (s, e) => Item_PropertyChanged(se, e, dob);
if (en.NewItems != null)
{
var coll = (ObservableCollection<SendContent>)se;
foreach (var item in coll)
{
item.PropertyChanged += handler;
}
}
if (en.OldItems != null)
{
var coll = (ObservableCollection<SendContent>)se;
foreach (var item in coll)
{
item.PropertyChanged -= handler;
}
}
}
private static void Item_PropertyChanged(object s, PropertyChangedEventArgs e, DependencyObject dob)
{
List<string> list = new List<string>();
var rtb = (RichTextBox)dob;
var collect = (ObservableCollection<SendContent>)s;
var dobj = (RichTextBox)dob;
foreach (var item in collect)
{
if (item.Value2)
{
list.Add(item.Value1);
}
}
if (list.Contains("Some2"))
{
dobj.Background = Brushes.Red;
}
else
{
dobj.Background = Brushes.Green;
}
}
如果我在构造函数Collect = new ObservableCollection<SendContent>();
中创建新集合并在按钮单击时添加项目(例如
Collect.Add(new SendContent { Value1 = "Some0", Value2 = true });
但是我尝试在构造函数中添加项目,RtbContentPropertyChanged
触发一次并获得已填充的集合er.NewValue
,并且它不会转向订阅每个添加项目的更改。我怎么能避免它?