上下文
我有一个未知的Model-Object,它包含一个或多个ObservableCollections。 这些集合包含实现INotifyPropertyChanged的对象。 我现在想要观察Model-Object中所有对象的PropertyChangedEvents。
我做了什么:
所以我写了这个使用反射来找到特定对象的方法。一切正常。除了它涉及MvvmCross函数WeakSubscribe的部分。我真的很喜欢背后的想法,但它似乎失去了参考,并没有解雇事件。
奇怪:如果我调试这段代码就行了。但没有断点就无法正常工作。
感谢您的帮助
private void SubscribeToDetailData()
{
var tempTokenList = new List<MvxNotifyPropertyChangedEventSubscription>();
var fieldInfos =
DetailData.GetType().GetRuntimeProperties().Where(f => Helpers.IsSubclassOfRawGeneric(typeof (ObservableCollection<>), f.PropertyType));
foreach (var fieldInfo in fieldInfos)
{
var collection = fieldInfo.GetValue(DetailData) as IEnumerable<object>;
if (collection == null)
continue;
foreach (var inpc in collection.Cast<INotifyPropertyChanged>())
{
tempTokenList.Add(inpc.WeakSubscribe((sender, e) => DetailDataPropertyChanged(e.PropertyName)));
}
}
_subscriptionTokens = tempTokenList.ToArray();
}
// This methode is never raised
private void DetailDataPropertyChanged(string propertyName)
{
if (_enabledFields.Evaluate(DetailData, propertyName))
RaisePropertyChanged(() => FieldEnabledState);
}
答案 0 :(得分:3)
可能是您订阅的Action
正在收集垃圾。
我认为,如果编译器创建匿名类的实例来实现您的匿名Action
,则可能会导致这种情况。我通常不希望在您的代码中发生这种情况,因为您没有在Action
中使用任何局部变量 - 但情况可能就是这样。
如果您将订阅更改为:
,您的代码是否有效tempTokenList.Add(inpc.WeakSubscribe(DetailDataPropertyChanged));
将方法签名更改为:
private void DetailDataPropertyChanged(object sender, PropertyChangedEventArgs e)