Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / Tools / System.Activities.Presentation / System / Activities / Presentation / Base / Core / PropertyEditing / PropertyValue.cs / 1305376 / PropertyValue.cs
namespace System.Activities.Presentation.PropertyEditing { using System.Globalization; using System; using System.Collections; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Activities.Presentation.Internal.Properties; using System.Activities.Presentation; ////// This class provides a data model for the underlying property value. /// public abstract class PropertyValue : INotifyPropertyChanged { private PropertyEntry _parentProperty; ////// Creates a PropertyValue. For host infrastructure. /// /// The PropertyEntry that corresponds to this PropertyValue ///When parentProperty is null protected PropertyValue(PropertyEntry parentProperty) { if (parentProperty == null) throw FxTrace.Exception.ArgumentNull("parentProperty"); _parentProperty = parentProperty; } ////// Event that gets fired when any properties of the PropertyValue class change. /// Note that a "Value" and "StringValue" property changed notification gets fired /// either when the Value or StringValue get set to a new instance OR when any /// sub-properties of this PropertyValue change. /// public event PropertyChangedEventHandler PropertyChanged; ////// Event fired when the Value or StringValue properties of this class /// get updated with new instances. /// public event EventHandler RootValueChanged; ////// Event fired when the any of the sub-properties of this PropertyValue /// or its sub-properties get updated with new value instances. /// public event EventHandler SubPropertyChanged; ////// Gets the parent PropertyEntry. /// public PropertyEntry ParentProperty { get { return _parentProperty; } } ////// Gets a PropertyValueSource that contains information /// about where this value is coming from. /// public abstract PropertyValueSource Source { get; } ////// Returns true if Value is the default value for the property /// public abstract bool IsDefaultValue { get; } ////// Returns true if this value represents a property for multiple objects with /// more than one value - for example 2 Buttons with different values for Background /// If this property is true then Value will return null and and StringValue will return /// String.Empty. /// public abstract bool IsMixedValue { get; } ////// Throws if the value is invalid /// /// value to validate protected abstract void ValidateValue(object valueToValidate); ////// Gets a flag indicating whether the underlying value can be converted from a string /// public abstract bool CanConvertFromString { get; } ////// Returns the given string as a value - used to convert StringValue to Value /// Typical implementations would use the TypeConverter for the underlying property /// This method should not catch exceptions, it should propagate them. /// protected abstract object ConvertStringToValue(string value); ////// Returns the value as a String - used to convert Value to StringValue /// Typical implementations would use the TypeConverter for the underlying property /// protected abstract string ConvertValueToString(object value); ////// Gets the underlying property value. /// protected abstract object GetValueCore(); ////// Sets the underlying property value. This method should not catch /// exceptions, but allow them to propagate. /// protected abstract void SetValueCore(object value); ////// Clears this value such that it is unset. /// public abstract void ClearValue(); // Value Property ////// Gets or sets the underlying property value. Both Value and StringValue /// will raise the appropriate change notifications. /// [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Propagating the error might cause VS to crash")] [SuppressMessage("Reliability", "Reliability108", Justification = "Propagating the error might cause VS to crash")] public object Value { get { object returnValue = null; if (this.CatchExceptions) { try { returnValue = GetValueCore(); } catch (Exception ex) { OnPropertyValueException(new PropertyValueExceptionEventArgs( string.Format( CultureInfo.CurrentCulture, Resources.Error_ValueGetFailed), this, PropertyValueExceptionSource.Get, ex)); } } else { returnValue = GetValueCore(); } return returnValue; } set { try { SetValueImpl(value); } catch (Exception ex) { bool isValidationException = ex is ValidationException; //show error message if we do catch exception or exception is ValidationException if (this.CatchExceptions || isValidationException) { OnPropertyValueException(new PropertyValueExceptionEventArgs( string.Format(CultureInfo.CurrentCulture, Resources.Error_ValueSetFailed), this, PropertyValueExceptionSource.Set, ex)); } //rethrow if we do not catch exception or exception is ValidationException (it should be handled by the control) if (!this.CatchExceptions || isValidationException) { throw; } } } } private void SetValueImpl(object value) { ValidateValue(value); SetValueCore(value); NotifyValueChanged(); OnRootValueChanged(); } // StringValue Property ////// Gets or sets the underlying property value as a string. Both Value and StringValue /// will raise the appropriate change notifications. /// [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Propagating the error might cause VS to crash")] [SuppressMessage("Reliability", "Reliability108", Justification = "Propagating the error might cause VS to crash")] public string StringValue { get { string returnValue = string.Empty; //If there is an error event handler then use it otherwise let the exception //propogate if (this.CatchExceptions) { try { //Caching opportunity here returnValue = this.ConvertValueToString(this.Value); } catch (Exception ex) { OnPropertyValueException(new PropertyValueExceptionEventArgs( string.Format( CultureInfo.CurrentCulture, Resources.Error_CannotConvertValueToString), this, PropertyValueExceptionSource.Get, ex)); } } else { //Caching opportunity here returnValue = this.ConvertValueToString(this.Value); } return returnValue; } set { //If there is an error event handler then use it otherwise let the exception //propogate if (CatchExceptions) { try { this.Value = this.ConvertStringToValue(value); } catch (Exception ex) { OnPropertyValueException( new PropertyValueExceptionEventArgs( string.Format( CultureInfo.CurrentCulture, Resources.Error_CannotUpdateValueFromStringValue), this, PropertyValueExceptionSource.Set, ex)); } } else { this.Value = this.ConvertStringToValue(value); } } } // SubProperties ////// Gets a flag indicating whether the type of this property /// supports sub-properties. Typical implementations will use a TypeConverter /// to verify whether sub-properties exist. /// public abstract bool HasSubProperties { get; } ////// Gets a collection of sub-properties as PropertyEntry instances /// public abstract PropertyEntryCollection SubProperties { get; } // Collections ////// Gets a flag indicating whether this PropertyValue models a property /// whose value is a collection. /// public abstract bool IsCollection { get; } ////// Gets a collection of PropertyValue instances that correspond to the items /// in the collection when IsCollection is true. /// public abstract PropertyValueCollection Collection { get; } // Error Handling ////// Event for host implementations to use for error handling. Raised when StringValue or Value throws /// and CatchExceptions is true. If CatchExceptions is false, the exception will be thrown up the stack. /// public event EventHandlerPropertyValueException; /// /// Gets a boolean indicating whether exceptions thrown during value gets and sets /// should be caught or propagated directly to the caller. By default, exceptions /// are caught if there is at least one subscriber to the PropertyValueException event. /// protected virtual bool CatchExceptions { get { return PropertyValueException != null; } } ////// Called when PropertyValue get or set fails. Default implementation raises the /// PropertyValueException event. /// /// PropertyValueExceptionEventArgs ///When e is null protected virtual void OnPropertyValueException(PropertyValueExceptionEventArgs e) { if (e == null) throw FxTrace.Exception.ArgumentNull("e"); if (PropertyValueException != null) PropertyValueException(this, e); } // Notification Helpers ////// Raises change notification for all properties. This should be called when /// the underlying object is changed externally (for example Button.Width is /// changed on the design surface) /// protected virtual void NotifyRootValueChanged() { //When Value is updated or the model is reset we //need to fire an "everything has changed" notification //This doesn't appear to work at all... //PropertyChanged(this, new PropertyChangedEventArgs("")); //So notify these key changes individually OnPropertyChanged("IsDefaultValue"); OnPropertyChanged("IsMixedValue"); OnPropertyChanged("IsCollection"); OnPropertyChanged("Collection"); OnPropertyChanged("HasSubProperties"); OnPropertyChanged("SubProperties"); OnPropertyChanged("Source"); OnPropertyChanged("CanConvertFromString"); NotifyValueChanged(); OnRootValueChanged(); } ////// Called to raise the SubPropertyChanged event. This method should be called /// when one of the sub-properties of this property changes. It raises changed /// events for Value, StringValue, and SubProperty /// protected void NotifySubPropertyChanged() { NotifyValueChanged(); OnSubPropertyChanged(); } ////// Called to raise the changed events for Value and StringValue. This method /// should only be called to trigger the refresh of the visual representation /// of this value. If the value content actually changes, call NotifyRootValueChanged /// instead. /// private void NotifyValueChanged() { OnPropertyChanged("Value"); NotifyStringValueChanged(); } ////// Raise change notification for StringValue /// private void NotifyStringValueChanged() { OnPropertyChanged("StringValue"); } ////// Called to raise the RootValueChanged event /// private void OnRootValueChanged() { if (RootValueChanged != null) RootValueChanged(this, EventArgs.Empty); } ////// Called to raise the SubPropertyChanged event /// private void OnSubPropertyChanged() { if (SubPropertyChanged != null) SubPropertyChanged(this, EventArgs.Empty); } // INotifyPropertyChanged ////// Raises the PropertyChanged event. Subclasses that override this method /// should call the base class implementation. /// /// protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) PropertyChanged(this, e); } ////// Raises the PropertyChanged event. /// /// protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Activities.Presentation.PropertyEditing { using System.Globalization; using System; using System.Collections; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Activities.Presentation.Internal.Properties; using System.Activities.Presentation; ////// This class provides a data model for the underlying property value. /// public abstract class PropertyValue : INotifyPropertyChanged { private PropertyEntry _parentProperty; ////// Creates a PropertyValue. For host infrastructure. /// /// The PropertyEntry that corresponds to this PropertyValue ///When parentProperty is null protected PropertyValue(PropertyEntry parentProperty) { if (parentProperty == null) throw FxTrace.Exception.ArgumentNull("parentProperty"); _parentProperty = parentProperty; } ////// Event that gets fired when any properties of the PropertyValue class change. /// Note that a "Value" and "StringValue" property changed notification gets fired /// either when the Value or StringValue get set to a new instance OR when any /// sub-properties of this PropertyValue change. /// public event PropertyChangedEventHandler PropertyChanged; ////// Event fired when the Value or StringValue properties of this class /// get updated with new instances. /// public event EventHandler RootValueChanged; ////// Event fired when the any of the sub-properties of this PropertyValue /// or its sub-properties get updated with new value instances. /// public event EventHandler SubPropertyChanged; ////// Gets the parent PropertyEntry. /// public PropertyEntry ParentProperty { get { return _parentProperty; } } ////// Gets a PropertyValueSource that contains information /// about where this value is coming from. /// public abstract PropertyValueSource Source { get; } ////// Returns true if Value is the default value for the property /// public abstract bool IsDefaultValue { get; } ////// Returns true if this value represents a property for multiple objects with /// more than one value - for example 2 Buttons with different values for Background /// If this property is true then Value will return null and and StringValue will return /// String.Empty. /// public abstract bool IsMixedValue { get; } ////// Throws if the value is invalid /// /// value to validate protected abstract void ValidateValue(object valueToValidate); ////// Gets a flag indicating whether the underlying value can be converted from a string /// public abstract bool CanConvertFromString { get; } ////// Returns the given string as a value - used to convert StringValue to Value /// Typical implementations would use the TypeConverter for the underlying property /// This method should not catch exceptions, it should propagate them. /// protected abstract object ConvertStringToValue(string value); ////// Returns the value as a String - used to convert Value to StringValue /// Typical implementations would use the TypeConverter for the underlying property /// protected abstract string ConvertValueToString(object value); ////// Gets the underlying property value. /// protected abstract object GetValueCore(); ////// Sets the underlying property value. This method should not catch /// exceptions, but allow them to propagate. /// protected abstract void SetValueCore(object value); ////// Clears this value such that it is unset. /// public abstract void ClearValue(); // Value Property ////// Gets or sets the underlying property value. Both Value and StringValue /// will raise the appropriate change notifications. /// [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Propagating the error might cause VS to crash")] [SuppressMessage("Reliability", "Reliability108", Justification = "Propagating the error might cause VS to crash")] public object Value { get { object returnValue = null; if (this.CatchExceptions) { try { returnValue = GetValueCore(); } catch (Exception ex) { OnPropertyValueException(new PropertyValueExceptionEventArgs( string.Format( CultureInfo.CurrentCulture, Resources.Error_ValueGetFailed), this, PropertyValueExceptionSource.Get, ex)); } } else { returnValue = GetValueCore(); } return returnValue; } set { try { SetValueImpl(value); } catch (Exception ex) { bool isValidationException = ex is ValidationException; //show error message if we do catch exception or exception is ValidationException if (this.CatchExceptions || isValidationException) { OnPropertyValueException(new PropertyValueExceptionEventArgs( string.Format(CultureInfo.CurrentCulture, Resources.Error_ValueSetFailed), this, PropertyValueExceptionSource.Set, ex)); } //rethrow if we do not catch exception or exception is ValidationException (it should be handled by the control) if (!this.CatchExceptions || isValidationException) { throw; } } } } private void SetValueImpl(object value) { ValidateValue(value); SetValueCore(value); NotifyValueChanged(); OnRootValueChanged(); } // StringValue Property ////// Gets or sets the underlying property value as a string. Both Value and StringValue /// will raise the appropriate change notifications. /// [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Propagating the error might cause VS to crash")] [SuppressMessage("Reliability", "Reliability108", Justification = "Propagating the error might cause VS to crash")] public string StringValue { get { string returnValue = string.Empty; //If there is an error event handler then use it otherwise let the exception //propogate if (this.CatchExceptions) { try { //Caching opportunity here returnValue = this.ConvertValueToString(this.Value); } catch (Exception ex) { OnPropertyValueException(new PropertyValueExceptionEventArgs( string.Format( CultureInfo.CurrentCulture, Resources.Error_CannotConvertValueToString), this, PropertyValueExceptionSource.Get, ex)); } } else { //Caching opportunity here returnValue = this.ConvertValueToString(this.Value); } return returnValue; } set { //If there is an error event handler then use it otherwise let the exception //propogate if (CatchExceptions) { try { this.Value = this.ConvertStringToValue(value); } catch (Exception ex) { OnPropertyValueException( new PropertyValueExceptionEventArgs( string.Format( CultureInfo.CurrentCulture, Resources.Error_CannotUpdateValueFromStringValue), this, PropertyValueExceptionSource.Set, ex)); } } else { this.Value = this.ConvertStringToValue(value); } } } // SubProperties ////// Gets a flag indicating whether the type of this property /// supports sub-properties. Typical implementations will use a TypeConverter /// to verify whether sub-properties exist. /// public abstract bool HasSubProperties { get; } ////// Gets a collection of sub-properties as PropertyEntry instances /// public abstract PropertyEntryCollection SubProperties { get; } // Collections ////// Gets a flag indicating whether this PropertyValue models a property /// whose value is a collection. /// public abstract bool IsCollection { get; } ////// Gets a collection of PropertyValue instances that correspond to the items /// in the collection when IsCollection is true. /// public abstract PropertyValueCollection Collection { get; } // Error Handling ////// Event for host implementations to use for error handling. Raised when StringValue or Value throws /// and CatchExceptions is true. If CatchExceptions is false, the exception will be thrown up the stack. /// public event EventHandlerPropertyValueException; /// /// Gets a boolean indicating whether exceptions thrown during value gets and sets /// should be caught or propagated directly to the caller. By default, exceptions /// are caught if there is at least one subscriber to the PropertyValueException event. /// protected virtual bool CatchExceptions { get { return PropertyValueException != null; } } ////// Called when PropertyValue get or set fails. Default implementation raises the /// PropertyValueException event. /// /// PropertyValueExceptionEventArgs ///When e is null protected virtual void OnPropertyValueException(PropertyValueExceptionEventArgs e) { if (e == null) throw FxTrace.Exception.ArgumentNull("e"); if (PropertyValueException != null) PropertyValueException(this, e); } // Notification Helpers ////// Raises change notification for all properties. This should be called when /// the underlying object is changed externally (for example Button.Width is /// changed on the design surface) /// protected virtual void NotifyRootValueChanged() { //When Value is updated or the model is reset we //need to fire an "everything has changed" notification //This doesn't appear to work at all... //PropertyChanged(this, new PropertyChangedEventArgs("")); //So notify these key changes individually OnPropertyChanged("IsDefaultValue"); OnPropertyChanged("IsMixedValue"); OnPropertyChanged("IsCollection"); OnPropertyChanged("Collection"); OnPropertyChanged("HasSubProperties"); OnPropertyChanged("SubProperties"); OnPropertyChanged("Source"); OnPropertyChanged("CanConvertFromString"); NotifyValueChanged(); OnRootValueChanged(); } ////// Called to raise the SubPropertyChanged event. This method should be called /// when one of the sub-properties of this property changes. It raises changed /// events for Value, StringValue, and SubProperty /// protected void NotifySubPropertyChanged() { NotifyValueChanged(); OnSubPropertyChanged(); } ////// Called to raise the changed events for Value and StringValue. This method /// should only be called to trigger the refresh of the visual representation /// of this value. If the value content actually changes, call NotifyRootValueChanged /// instead. /// private void NotifyValueChanged() { OnPropertyChanged("Value"); NotifyStringValueChanged(); } ////// Raise change notification for StringValue /// private void NotifyStringValueChanged() { OnPropertyChanged("StringValue"); } ////// Called to raise the RootValueChanged event /// private void OnRootValueChanged() { if (RootValueChanged != null) RootValueChanged(this, EventArgs.Empty); } ////// Called to raise the SubPropertyChanged event /// private void OnSubPropertyChanged() { if (SubPropertyChanged != null) SubPropertyChanged(this, EventArgs.Empty); } // INotifyPropertyChanged ////// Raises the PropertyChanged event. Subclasses that override this method /// should call the base class implementation. /// /// protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) PropertyChanged(this, e); } ////// Raises the PropertyChanged event. /// /// protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LayoutUtils.cs
- DbModificationCommandTree.cs
- CopyCodeAction.cs
- x509utils.cs
- ObjectQuery_EntitySqlExtensions.cs
- XmlBoundElement.cs
- XmlNamespaceMappingCollection.cs
- TableLayoutPanelCellPosition.cs
- _ChunkParse.cs
- SessionStateModule.cs
- FrameworkContentElement.cs
- ObjectDataSourceSelectingEventArgs.cs
- _NetworkingPerfCounters.cs
- SQLUtility.cs
- RelationshipDetailsRow.cs
- DoubleKeyFrameCollection.cs
- ServiceBusyException.cs
- SqlMethodTransformer.cs
- Literal.cs
- XmlWrappingReader.cs
- InvalidOleVariantTypeException.cs
- ColorConvertedBitmap.cs
- StreamGeometry.cs
- PathFigure.cs
- BidPrivateBase.cs
- StackSpiller.Temps.cs
- XpsResource.cs
- FileIOPermission.cs
- XmlHierarchicalDataSourceView.cs
- XPathQilFactory.cs
- MatrixAnimationUsingKeyFrames.cs
- CodeGenerator.cs
- ValidationResult.cs
- OdbcDataAdapter.cs
- XPathDocumentNavigator.cs
- ISAPIApplicationHost.cs
- HwndHost.cs
- SqlStream.cs
- CodeVariableDeclarationStatement.cs
- SafeArrayRankMismatchException.cs
- ErrorWrapper.cs
- DBSchemaTable.cs
- XmlHierarchyData.cs
- path.cs
- IndexOutOfRangeException.cs
- InvokeWebServiceDesigner.cs
- TcpChannelFactory.cs
- ReliabilityContractAttribute.cs
- PagedDataSource.cs
- NetCodeGroup.cs
- _OverlappedAsyncResult.cs
- SecurityTokenProvider.cs
- SqlHelper.cs
- SocketStream.cs
- SqlClientMetaDataCollectionNames.cs
- EditorAttribute.cs
- WebPartCancelEventArgs.cs
- SchemaDeclBase.cs
- ObjectHandle.cs
- FrugalMap.cs
- ContextItem.cs
- ReachBasicContext.cs
- RequestQueryProcessor.cs
- MetafileHeaderWmf.cs
- OledbConnectionStringbuilder.cs
- Decorator.cs
- CellCreator.cs
- WpfWebRequestHelper.cs
- PackagePart.cs
- Page.cs
- WaitHandleCannotBeOpenedException.cs
- UpdateExpressionVisitor.cs
- SessionChannels.cs
- EtwTrace.cs
- Model3D.cs
- UpDownEvent.cs
- Matrix3D.cs
- XmlILOptimizerVisitor.cs
- InkCanvasSelection.cs
- JavascriptCallbackMessageInspector.cs
- URL.cs
- Misc.cs
- SuppressIldasmAttribute.cs
- XmlElementElement.cs
- ChannelManager.cs
- ComponentCommands.cs
- NonClientArea.cs
- webbrowsersite.cs
- AbsoluteQuery.cs
- Serializer.cs
- WmlControlAdapter.cs
- WindowAutomationPeer.cs
- ServiceNameCollection.cs
- GenericWebPart.cs
- Annotation.cs
- TableRowCollection.cs
- PresentationTraceSources.cs
- ColorContext.cs
- FactoryGenerator.cs
- AtlasWeb.Designer.cs