弱势订阅MvvmCross dosn工作正确

时间:2014-05-14 07:37:51

标签: c# mvvmcross

上下文

我有一个未知的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);
    }

1 个答案:

答案 0 :(得分:3)

可能是您订阅的Action正在收集垃圾。

我认为,如果编译器创建匿名类的实例来实现您的匿名Action,则可能会导致这种情况。我通常不希望在您的代码中发生这种情况,因为您没有在Action中使用任何局部变量 - 但情况可能就是这样。

如果您将订阅更改为:

,您的代码是否有效
tempTokenList.Add(inpc.WeakSubscribe(DetailDataPropertyChanged)); 

将方法签名更改为:

private void DetailDataPropertyChanged(object sender, PropertyChangedEventArgs e)