1

我现在正在启动一个新的 Silverlight 项目,如果我的 ViewModel(它正在为我实例化)包含 RaisePropertyChanged 事件,我会遇到 Unity 引发异常的问题。

我看起来像这样:

public class AddNewClientViewModel : ViewModelBase {

    private Visibility _extraClientFieldsVisible;
    public Visibility ExtraClientFieldsVisible {
        get {
            return _extraClientFieldsVisible;
        }
        set {
            _extraClientFieldsVisible = value;
            base.RaisePropertyChanged("ExtraClientFieldsVisible");
        }
    }


public AddNewClientViewModel(IMyInterface blah) {


       ExtraClientFieldsVisible = Visibility.Collapsed;
}

它继承的 ViewModelBase 如下所示:

    public abstract class ViewModelBase : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    public  void RaisePropertyChanged(string propertyName) {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }


}

完整的堆栈跟踪如下所示,但似乎在构造函数期间调用 RaisePropertyChanged 事件会导致 Unity 崩溃。

这是错误的完整堆栈跟踪:

Microsoft.Practices.Unity.ResolutionFailedException was unhandled by user code
Message="Resolution of the dependency failed, type = \"ClientSide.ViewModels.AddNewClientViewModel\", name = \"\". Exception message is: The current build operation (build key Build Key[ClientSide.ViewModels.AddNewClientViewModel, null]) failed: Object reference not set to an instance of an object. (Strategy type BuildPlanStrategy, index 3)"
TypeRequested="AddNewClientViewModel"
 StackTrace:
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name)
   at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name)
   at Microsoft.Practices.Unity.UnityContainerBase.Resolve(Type t)
   at Microsoft.Practices.Unity.UnityContainerBase.Resolve[T]()
   at ClientSide.Framework.ServiceLocator.get_AddNewClientViewModel()
InnerException: Microsoft.Practices.ObjectBuilder2.BuildFailedException
   Message="The current build operation (build key Build Key[ClientSide.ViewModels.AddNewClientViewModel, null]) failed: Object reference not set to an instance of an object. (Strategy type BuildPlanStrategy, index 3)"
   BuildKey="Build Key[ClientSide.ViewModels.AddNewClientViewModel, null]"
   ExecutingStrategyIndex=3
   ExecutingStrategyTypeName="BuildPlanStrategy"
   StackTrace:
        at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
        at Microsoft.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator locator, ILifetimeContainer lifetime, IPolicyList policies, IStrategyChain strategies, Object buildKey, Object existing)
        at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
   InnerException: System.NullReferenceException
        Message="Object reference not set to an instance of an object."
        StackTrace:
             at ClientSide.ViewModels.ViewModelBase.RaisePropertyChanged(String propertyName)
             at ClientSide.ViewModels.AddNewClientViewModel.set_ExtraClientFieldsVisible(Visibility value)
             at ClientSide.ViewModels.AddNewClientViewModel..ctor(IDataCore dataCore)
             at BuildUp_ClientSide.ViewModels.AddNewClientViewModel(IBuilderContext )
             at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)
             at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)
             at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
        InnerException: 

所以我遇到了 NullReferenceException。我无法弄清楚如何...

4

1 回答 1

3

为什么不只检查 null in RaisePropertyChanged()

毕竟,它不会造成不良的副作用......

于 2009-11-08T06:48:33.800 回答