Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / Data / DynamicValueConverter.cs / 1305600 / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RectangleGeometry.cs
- AutoResetEvent.cs
- SpecularMaterial.cs
- MatrixTransform3D.cs
- Int64AnimationBase.cs
- HitTestParameters3D.cs
- Frame.cs
- Property.cs
- ApplicationServiceManager.cs
- ValueTable.cs
- ActivityBindForm.Designer.cs
- ToolStripGripRenderEventArgs.cs
- FileLogRecordStream.cs
- AutomationElementIdentifiers.cs
- OleStrCAMarshaler.cs
- NamespaceImport.cs
- DurableRuntimeValidator.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- RelationshipSet.cs
- X509Chain.cs
- CodeAttachEventStatement.cs
- StyleTypedPropertyAttribute.cs
- GeneratedView.cs
- ScriptComponentDescriptor.cs
- Emitter.cs
- DataSourceControlBuilder.cs
- SimpleParser.cs
- TimerElapsedEvenArgs.cs
- ExpressionPrinter.cs
- FunctionCommandText.cs
- OutputCacheSection.cs
- XmlSchemaException.cs
- Int64Storage.cs
- MulticastOption.cs
- RegistryPermission.cs
- AuthenticationConfig.cs
- UnSafeCharBuffer.cs
- ProtocolsConfigurationHandler.cs
- DbSourceCommand.cs
- TableLayoutStyle.cs
- PolicyUtility.cs
- ScaleTransform.cs
- DataGridViewColumnEventArgs.cs
- ApplicationManager.cs
- MultiBindingExpression.cs
- StreamUpdate.cs
- PerformanceCounterManager.cs
- SiteMapHierarchicalDataSourceView.cs
- ConnectionManager.cs
- StorageMappingItemLoader.cs
- WhitespaceSignificantCollectionAttribute.cs
- ConfigurationLocation.cs
- UnsafeNativeMethodsCLR.cs
- EnumMember.cs
- DataGridViewIntLinkedList.cs
- FillBehavior.cs
- ScriptBehaviorDescriptor.cs
- UInt64.cs
- ReliableMessagingVersion.cs
- StructuredTypeEmitter.cs
- CodeValidator.cs
- LinkedResourceCollection.cs
- TimeoutValidationAttribute.cs
- PropertyRef.cs
- FrameworkElementFactoryMarkupObject.cs
- ScriptRef.cs
- _LocalDataStore.cs
- LabelExpression.cs
- HttpProfileBase.cs
- BaseDataListDesigner.cs
- QueryValue.cs
- LocalBuilder.cs
- _SSPIWrapper.cs
- HttpFileCollectionBase.cs
- ImageListImage.cs
- OdbcDataAdapter.cs
- Int32AnimationUsingKeyFrames.cs
- RemotingException.cs
- X509CertificateClaimSet.cs
- LayoutExceptionEventArgs.cs
- XamlLoadErrorInfo.cs
- DefaultBindingPropertyAttribute.cs
- GridProviderWrapper.cs
- RelatedView.cs
- XsdBuilder.cs
- SpecularMaterial.cs
- MatrixAnimationBase.cs
- StrokeNodeEnumerator.cs
- DataGridColumnHeaderAutomationPeer.cs
- AsyncWaitHandle.cs
- tooltip.cs
- ClipboardData.cs
- ContainerSelectorActiveEvent.cs
- DbDataSourceEnumerator.cs
- PathTooLongException.cs
- Odbc32.cs
- RunInstallerAttribute.cs
- oledbconnectionstring.cs
- TagPrefixAttribute.cs
- ToolStripContainerDesigner.cs