2009-11-08 2 views
1

Я начинаю новый проект Silverlight на данный момент, и у меня возникают проблемы, когда Unity бросает исключение, если мой ViewModel (который он создает для меня) содержит событие RaisePropertyChanged.Silverlight, Unity и INotifyPropertyChanged

Я выглядит следующим образом:

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. Я не могу просто понять, как ...

ответ

3

Почему бы просто не проверить нуль в RaisePropertyChanged()?

В конце концов, это не будет вызывать нежелательные побочные эффекты ...

+0

Я действительно .. идиот .. смотрел на это слишком долго .. спасибо. – ChadT

+0

Не волнуйся - мы все были там :) –

Смежные вопросы