Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / MS / Internal / Data / DynamicValueConverter.cs / 1 / DynamicValueConverter.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: wrapper around default converter to dynamcially pick // and change value converters depending on changing source and target types // //--------------------------------------------------------------------------- using System; using System.Globalization; using System.Collections; using System.ComponentModel; using System.Reflection; using System.Windows; using System.Windows.Data; using MS.Internal; // Invariant.Assert using System.Diagnostics; namespace MS.Internal.Data { // dynamically pick and switch a default value converter to convert between source and target type internal class DynamicValueConverter : IValueConverter { internal DynamicValueConverter(bool targetToSourceNeeded) { _targetToSourceNeeded = targetToSourceNeeded; } internal DynamicValueConverter(bool targetToSourceNeeded, Type sourceType, Type targetType) { _targetToSourceNeeded = targetToSourceNeeded; EnsureConverter(sourceType, targetType); } internal object Convert(object value, Type targetType) { return Convert(value, targetType, null, CultureInfo.InvariantCulture); } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { object result = DependencyProperty.UnsetValue; // meaning: failure to convert if (value != null) { Type sourceType = value.GetType(); EnsureConverter(sourceType, targetType); if (_converter != null) { result = _converter.Convert(value, targetType, parameter, culture); } } else { if (!targetType.IsValueType) { result = null; } } return result; } public object ConvertBack(object value, Type sourceType, object parameter, CultureInfo culture) { object result = DependencyProperty.UnsetValue; // meaning: failure to convert if (value != null) { Type targetType = value.GetType(); EnsureConverter(sourceType, targetType); if (_converter != null) { result = _converter.ConvertBack(value, sourceType, parameter, culture); } } else { if (!sourceType.IsValueType) { result = null; } } return result; } private void EnsureConverter(Type sourceType, Type targetType) { if ((_sourceType != sourceType) || (_targetType != targetType)) { // types have changed - get a new converter if (sourceType != null && targetType != null) { // DefaultValueConverter.Create() is more sophisticated to find correct type converters, // e.g. if source/targetType is object or well-known system types. // if there is any change in types, give that code to come up with the correct converter if (_engine == null) { _engine = DataBindEngine.CurrentDataBindEngine; } Invariant.Assert(_engine != null); _converter = _engine.GetDefaultValueConverter(sourceType, targetType, _targetToSourceNeeded); } else { // if either type is null, no conversion is possible. // Don't ask GetDefaultValueConverter - it will use null as a // hashtable key, and crash (bug 110859). _converter = null; } _sourceType = sourceType; _targetType = targetType; } } private Type _sourceType; private Type _targetType; private IValueConverter _converter; private bool _targetToSourceNeeded; private DataBindEngine _engine; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: wrapper around default converter to dynamcially pick // and change value converters depending on changing source and target types // //--------------------------------------------------------------------------- using System; using System.Globalization; using System.Collections; using System.ComponentModel; using System.Reflection; using System.Windows; using System.Windows.Data; using MS.Internal; // Invariant.Assert using System.Diagnostics; namespace MS.Internal.Data { // dynamically pick and switch a default value converter to convert between source and target type internal class DynamicValueConverter : IValueConverter { internal DynamicValueConverter(bool targetToSourceNeeded) { _targetToSourceNeeded = targetToSourceNeeded; } internal DynamicValueConverter(bool targetToSourceNeeded, Type sourceType, Type targetType) { _targetToSourceNeeded = targetToSourceNeeded; EnsureConverter(sourceType, targetType); } internal object Convert(object value, Type targetType) { return Convert(value, targetType, null, CultureInfo.InvariantCulture); } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { object result = DependencyProperty.UnsetValue; // meaning: failure to convert if (value != null) { Type sourceType = value.GetType(); EnsureConverter(sourceType, targetType); if (_converter != null) { result = _converter.Convert(value, targetType, parameter, culture); } } else { if (!targetType.IsValueType) { result = null; } } return result; } public object ConvertBack(object value, Type sourceType, object parameter, CultureInfo culture) { object result = DependencyProperty.UnsetValue; // meaning: failure to convert if (value != null) { Type targetType = value.GetType(); EnsureConverter(sourceType, targetType); if (_converter != null) { result = _converter.ConvertBack(value, sourceType, parameter, culture); } } else { if (!sourceType.IsValueType) { result = null; } } return result; } private void EnsureConverter(Type sourceType, Type targetType) { if ((_sourceType != sourceType) || (_targetType != targetType)) { // types have changed - get a new converter if (sourceType != null && targetType != null) { // DefaultValueConverter.Create() is more sophisticated to find correct type converters, // e.g. if source/targetType is object or well-known system types. // if there is any change in types, give that code to come up with the correct converter if (_engine == null) { _engine = DataBindEngine.CurrentDataBindEngine; } Invariant.Assert(_engine != null); _converter = _engine.GetDefaultValueConverter(sourceType, targetType, _targetToSourceNeeded); } else { // if either type is null, no conversion is possible. // Don't ask GetDefaultValueConverter - it will use null as a // hashtable key, and crash (bug 110859). _converter = null; } _sourceType = sourceType; _targetType = targetType; } } private Type _sourceType; private Type _targetType; private IValueConverter _converter; private bool _targetToSourceNeeded; private DataBindEngine _engine; } } // 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
- ConfigWriter.cs
- FontStretch.cs
- FilteredAttributeCollection.cs
- TypeLibConverter.cs
- SQLMoneyStorage.cs
- Native.cs
- TcpProcessProtocolHandler.cs
- ProfilePropertySettingsCollection.cs
- TransformerConfigurationWizardBase.cs
- Faults.cs
- WebDisplayNameAttribute.cs
- TypeDependencyAttribute.cs
- UniqueCodeIdentifierScope.cs
- ResizeGrip.cs
- ProxyDataContractResolver.cs
- DbProviderSpecificTypePropertyAttribute.cs
- ClientApiGenerator.cs
- HealthMonitoringSection.cs
- AsyncPostBackErrorEventArgs.cs
- MemberMaps.cs
- ManagementOptions.cs
- OptimalBreakSession.cs
- XmlSerializerFactory.cs
- bindurihelper.cs
- OdbcFactory.cs
- EmbeddedObject.cs
- SmtpMail.cs
- RegisteredExpandoAttribute.cs
- HttpPostedFileBase.cs
- Rect3DConverter.cs
- ListItemCollection.cs
- CheckableControlBaseAdapter.cs
- CookieProtection.cs
- AssemblyContextControlItem.cs
- WindowsRebar.cs
- EntityContainerAssociationSetEnd.cs
- SimpleBitVector32.cs
- XmlDomTextWriter.cs
- __ComObject.cs
- ZoneMembershipCondition.cs
- BaseUriHelper.cs
- FuncCompletionCallbackWrapper.cs
- CaseStatementSlot.cs
- StringReader.cs
- EventListener.cs
- IriParsingElement.cs
- DiffuseMaterial.cs
- TabControlCancelEvent.cs
- _NestedSingleAsyncResult.cs
- Variable.cs
- IdentityManager.cs
- AttributeQuery.cs
- CollectionBase.cs
- ProvidersHelper.cs
- WebPartMovingEventArgs.cs
- MouseWheelEventArgs.cs
- ValuePatternIdentifiers.cs
- LineProperties.cs
- HtmlShimManager.cs
- IPGlobalProperties.cs
- WebPartEditorCancelVerb.cs
- Vector3DAnimation.cs
- SafeFileHandle.cs
- TypeExtension.cs
- GeometryHitTestParameters.cs
- ProfileGroupSettings.cs
- TextDataBindingHandler.cs
- AuthorizationRule.cs
- CrossSiteScriptingValidation.cs
- InfoCardBinaryReader.cs
- smtpconnection.cs
- BitmapMetadataBlob.cs
- DataServiceQueryOfT.cs
- ValidationErrorCollection.cs
- _TimerThread.cs
- ResourceDescriptionAttribute.cs
- Page.cs
- ReferencedCollectionType.cs
- FixedTextView.cs
- NGCSerializerAsync.cs
- ExportFileRequest.cs
- NumberSubstitution.cs
- NegotiateStream.cs
- ContainerFilterService.cs
- TextTreePropertyUndoUnit.cs
- WaitHandleCannotBeOpenedException.cs
- CroppedBitmap.cs
- RightsManagementInformation.cs
- StructuredProperty.cs
- DragStartedEventArgs.cs
- ProfilePropertyNameValidator.cs
- GeometryConverter.cs
- XmlWriter.cs
- HtmlControl.cs
- XmlSchemaDatatype.cs
- DesigntimeLicenseContext.cs
- Rect.cs
- bindurihelper.cs
- NativeMethods.cs
- DataGridViewTextBoxColumn.cs