Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Controls / DataErrorValidationRule.cs / 1305600 / DataErrorValidationRule.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) by Microsoft Corporation. All rights reserved.
//
//
//
// Description:
// DataErrorValidationRule is used when a ValidationError is the result of
// a data error in the source item itself (e.g. as exposed by IDataErrorInfo).
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using MS.Internal;
namespace System.Windows.Controls
{
///
/// DataErrorValidationRule can be added to the ValidationRulesCollection of a Binding
/// or MultiBinding to indicate that data errors in the source object should
/// be considered ValidationErrors
///
public sealed class DataErrorValidationRule : ValidationRule
{
///
/// DataErrorValidationRule ctor.
///
public DataErrorValidationRule() : base(ValidationStep.UpdatedValue, true)
{
}
///
/// Validate is called when Data binding is updating
///
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
// This rule is called during the CommittedValue step, so the value is the
// owner of the rule collection - either a BindingGroup or an individual
// binding expression.
BindingGroup bindingGroup;
BindingExpression bindingExpr;
if ((bindingGroup = value as BindingGroup) != null)
{
// in a BindingGroup, check the item-level IDataErrorInfo for each
// source item in the group
IList items = bindingGroup.Items;
for (int i=items.Count-1; i>=0; --i)
{
IDataErrorInfo idei = items[i] as IDataErrorInfo;
if (idei != null)
{
string error = idei.Error;
if (!String.IsNullOrEmpty(error))
{
return new ValidationResult(false, error);
}
}
}
}
else if ((bindingExpr = value as BindingExpression) != null)
{
// in a binding, check the error info for the binding's source
// property
IDataErrorInfo idei = bindingExpr.SourceItem as IDataErrorInfo;
string name = (idei != null) ? bindingExpr.SourcePropertyName : null;
if (!String.IsNullOrEmpty(name))
{
// get the data error information, if any, by calling idie[name].
// We do this in a paranoid way, even though indexers with
// string-valued arguments are not supposed to throw exceptions.
// PreSharp uses message numbers that the C# compiler doesn't know about.
// Disable the C# complaints, per the PreSharp documentation.
#pragma warning disable 1634, 1691
// PreSharp complains about catching NullReference (and other) exceptions.
// It doesn't recognize that IsCritical[Application]Exception() handles these correctly.
#pragma warning disable 56500
string error;
try
{
error = idei[name];
}
catch (Exception ex)
{
if (CriticalExceptions.IsCriticalApplicationException(ex))
throw;
error = null;
if (TraceData.IsEnabled)
{
TraceData.Trace(TraceEventType.Error,
TraceData.DataErrorInfoFailed(
name,
idei.GetType().FullName,
ex.GetType().FullName,
ex.Message),
bindingExpr);
}
}
#pragma warning restore 56500
#pragma warning restore 1634, 1691
if (!String.IsNullOrEmpty(error))
{
return new ValidationResult(false, error);
}
}
}
else
throw new InvalidOperationException(SR.Get(SRID.ValidationRule_UnexpectedValue, this, value));
return ValidationResult.ValidResult;
}
internal static readonly DataErrorValidationRule Instance = new DataErrorValidationRule();
}
}
// 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
- WeakReference.cs
- ComponentResourceKeyConverter.cs
- VoiceChangeEventArgs.cs
- HtmlInputImage.cs
- VariantWrapper.cs
- SqlRecordBuffer.cs
- OutputScope.cs
- MouseGesture.cs
- DataConnectionHelper.cs
- NumberSubstitution.cs
- StreamReader.cs
- DataGridParentRows.cs
- counter.cs
- BitmapEffectGroup.cs
- WindowCollection.cs
- FrameworkReadOnlyPropertyMetadata.cs
- DataColumn.cs
- PropertyFilterAttribute.cs
- ToolZone.cs
- HuffmanTree.cs
- SelectionListComponentEditor.cs
- Exceptions.cs
- SoapParser.cs
- SuppressMessageAttribute.cs
- TcpProcessProtocolHandler.cs
- Trace.cs
- BackgroundWorker.cs
- NamedElement.cs
- InternalCache.cs
- ValuePattern.cs
- QilLiteral.cs
- SchemaManager.cs
- XmlSchemaValidationException.cs
- XPathQilFactory.cs
- ParallelActivityDesigner.cs
- WorkflowOperationContext.cs
- StorageInfo.cs
- TextContainerChangedEventArgs.cs
- DbConnectionClosed.cs
- AttributeAction.cs
- JpegBitmapDecoder.cs
- MethodBuilderInstantiation.cs
- Win32.cs
- srgsitem.cs
- AlphaSortedEnumConverter.cs
- BrowsableAttribute.cs
- ExpressionLink.cs
- DecoderFallback.cs
- InputReport.cs
- PropertyChangedEventArgs.cs
- SqlDataSourceFilteringEventArgs.cs
- listitem.cs
- TimeZone.cs
- OrderPreservingSpoolingTask.cs
- IdnElement.cs
- VisualBasicReference.cs
- X509CertificateValidator.cs
- TextDpi.cs
- LingerOption.cs
- FixedHyperLink.cs
- GetCryptoTransformRequest.cs
- SoapFault.cs
- Automation.cs
- UIElementAutomationPeer.cs
- PolyLineSegmentFigureLogic.cs
- XPathEmptyIterator.cs
- SessionSwitchEventArgs.cs
- SortAction.cs
- CollaborationHelperFunctions.cs
- CommandManager.cs
- XmlComment.cs
- MetadataUtilsSmi.cs
- RectValueSerializer.cs
- EntitySetDataBindingList.cs
- EncodingInfo.cs
- NullableFloatAverageAggregationOperator.cs
- FastEncoder.cs
- ReaderWriterLock.cs
- _NestedSingleAsyncResult.cs
- UnsafeNativeMethods.cs
- ReadOnlyHierarchicalDataSourceView.cs
- SystemColors.cs
- TextDecorationUnitValidation.cs
- ContentFileHelper.cs
- PrintDialog.cs
- SynchronizationLockException.cs
- DateTimeFormatInfoScanner.cs
- WebSysDescriptionAttribute.cs
- UpdateManifestForBrowserApplication.cs
- QuotaExceededException.cs
- ControlBuilder.cs
- FormViewPagerRow.cs
- OracleMonthSpan.cs
- ConfigXmlSignificantWhitespace.cs
- SchemaElementDecl.cs
- PerformanceCounterPermissionAttribute.cs
- ContainerParaClient.cs
- ConfigurationLockCollection.cs
- BaseConfigurationRecord.cs
- ProtocolsSection.cs