比较来自世界各地的卖家的域名和 IT 服务价格

物业成瘾 ObservableCollection 在收集中删除项目时未更新

我有一个附加的属性 ObservableCollection 在控制上。 如果我从集合添加或删除项目,则不会更新用户界面。 但是,如果我替换内部的集合,那么 ViewModel 用户界面将真正更新。

任何人都可以带领我在主题中需要做些什么,以便能够处理收集的变化?

下面列出了对象的一部分:


public class RadCalendarBehavior : DependencyObject
{
private static void OnSpecialDaysChanged/DependencyObject d, DependencyPropertyChangedEventArgs e/
{
var calendar = d as RadCalendar;
if /e.NewValue != null/
{
calendar.DayTemplateSelector = new SpecialDaySelector//ObservableCollection<datetime>/e.NewValue, GetSpecialDayTemplate/d//;
}
}

public static ObservableCollection<datetime> GetSpecialDays/DependencyObject obj/
{
return /ObservableCollection<datetime>/obj.GetValue/SpecialDaysProperty/;
}

public static void SetSpecialDays/DependencyObject obj, ObservableCollection<datetime> value/
{
obj.SetValue/SpecialDaysProperty, value/;
}

public static readonly DependencyProperty SpecialDaysProperty =
DependencyProperty.RegisterAttached/"SpecialDays", typeof/ObservableCollection<datetime>/, typeof/RadCalendarBehavior/, new UIPropertyMetadata/null, OnSpecialDaysChanged//;
}
}


我明白我需要注册收集已经改变了,但我不确定如何在酒店中执行此操作 dependency
</datetime></datetime></datetime></datetime></datetime>
已邀请:

卫东

赞同来自:

更改集合不会调用回调
OnSpecialDaysChanged

, 由于依赖属性的值没有改变。 如果需要响应收集中的更改的检测,则需要处理事件
CollectionChanged

手动:


private static void OnSpecialDaysChanged/DependencyObject d, DependencyPropertyChangedEventArgs e/
{
var calendar = d as RadCalendar;

if /e.OldValue != null/
{
var coll = /INotifyCollectionChanged/e.OldValue;
// Unsubscribe from CollectionChanged on the old collection
coll.CollectionChanged -= SpecialDays_CollectionChanged;
}

if /e.NewValue != null/
{
var coll = /ObservableCollection<datetime>/e.NewValue;
calendar.DayTemplateSelector = new SpecialDaySelector/coll, GetSpecialDayTemplate/d//;
// Subscribe to CollectionChanged on the new collection
coll.CollectionChanged += SpecialDays_CollectionChanged;
}
}

private static void SpecialDays_CollectionChanged/object sender, NotifyCollectionChangedEventArgs e/
{
// handle CollectionChanged
}


</datetime>

董宝中

赞同来自:

这只是为了增加托马斯的答案。 在我的代码中,我与属性交互 DependencyObject, 本地创建处理器对象,如下所示:


private static void OnSpecialDaysChanged/DependencyObject d, DependencyPropertyChangedEventArgs e/
{
var action = new NotifyCollectionChangedEventHandler/
/o, args/ =>
{
var calendar = d as RadCalendar;

if /calendar!= null/
{
// play with calendar's properties/methods
}
}/;

if /e.OldValue != null/
{
var coll = /INotifyCollectionChanged/e.OldValue;
// Unsubscribe from CollectionChanged on the old collection
coll.CollectionChanged -= action;
}

if /e.NewValue != null/
{
var coll = /ObservableCollection<datetime>/e.NewValue;
// Subscribe to CollectionChanged on the new collection
coll.CollectionChanged += action;
}
}


我希望这将有助于某人。
</datetime>

冰洋

赞同来自:

如果您有关系类型的收集类型,请记住以下内容:

如果您的属性是引用类型,则依赖关系属性元数据中指定的默认值不是每个实例的默认值; 相反,此默认值应用于类型的所有实例。 [...]

要解决此问题,您需要将唯一实例中的集合依赖的属性重置为类构造函数调用的一部分。

/厘米。
https://msdn.microsoft.com/en- ... .aspx
MSDN /

回答问题山姆 /我遇到了同样的问题/:

让您的CollectionChanged-Handler未被持久, unsubscribe/re-subscribe - 在实例级别。


private static void OnSpecialDaysChanged/DependencyObject d, DependencyPropertyChangedEventArgs e/
{
var calendar = d as RadCalendar;

if /e.OldValue != null/
{
var coll = /INotifyCollectionChanged/e.OldValue;
// Unsubscribe from CollectionChanged on the old collection of the DP-instance /!/
coll.CollectionChanged -= calendar.SpecialDays_CollectionChanged;
}

if /e.NewValue != null/
{
var coll = /ObservableCollection<datetime>/e.NewValue;
calendar.DayTemplateSelector = new SpecialDaySelector/coll, GetSpecialDayTemplate/d//;
// Subscribe to CollectionChanged on the new collection of the DP-instance /!/
coll.CollectionChanged += calendar.SpecialDays_CollectionChanged;
}
}

private void SpecialDays_CollectionChanged/object sender, NotifyCollectionChangedEventArgs e/
{
// handle CollectionChanged on instance-level
}


</datetime>

要回复问题请先登录注册