代码之家  ›  专栏  ›  技术社区  ›  ChadT

Silverlight、Unity和InotifyPropertiesChanged

  •  1
  • ChadT  · 技术社区  · 15 年前

    我现在正在启动一个新的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));
        }
    
    
    }
    

    下面记录了完整的堆栈跟踪,但在构造函数期间调用raisePropertiesChanged事件似乎会导致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。我不知道怎么…

    1 回复  |  直到 15 年前
        1
  •  3
  •   Vijay Patel    15 年前

    为什么不检查一下空值呢 RaisePropertyChanged() ?

    毕竟,它不会引起副作用…