Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / DataTrigger.cs / 1305600 / DataTrigger.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: Defines DataTrigger object, akin to Trigger except it // gets values from data. // //--------------------------------------------------------------------------- using System; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Windows.Data; using System.Windows.Markup; namespace System.Windows { ////// A single Style data conditional dependency driver /// [ContentProperty("Setters")] [XamlSetMarkupExtensionAttribute("ReceiveMarkupExtension")] public class DataTrigger : TriggerBase, IAddChild { ////// Binding declaration of the conditional /// [Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)] // Not localizable by-default public BindingBase Binding { get { // Verify Context Access VerifyAccess(); return _binding; } set { // Verify Context Access VerifyAccess(); if (IsSealed) { throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "DataTrigger")); } _binding = value; } } ////// Value of the condition (equality check) /// [DependsOn("Binding")] [Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)] // Not localizable by-default public object Value { get { // Verify Context Access VerifyAccess(); return _value; } set { // Verify Context Access VerifyAccess(); if (IsSealed) { throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "DataTrigger")); } if (value is MarkupExtension) { throw new ArgumentException(SR.Get(SRID.ConditionValueOfMarkupExtensionNotSupported, value.GetType().Name)); } if( value is Expression ) { throw new ArgumentException(SR.Get(SRID.ConditionValueOfExpressionNotSupported)); } _value = value; } } ////// Collection of Setter objects, which describes what to apply /// when this trigger is active. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public SetterBaseCollection Setters { get { // Verify Context Access VerifyAccess(); if( _setters == null ) { _setters = new SetterBaseCollection(); } return _setters; } } ////// This method is called to Add a Setter object as a child of the Style. /// /// /// The object to add as a child; it must be a Setter or subclass. /// void IAddChild.AddChild (Object value) { // Verify Context Access VerifyAccess(); Setters.Add(Trigger.CheckChildIsSetter(value)); } ////// This method is called by the parser when text appears under the tag in markup. /// As default Styles do not support text, calling this method has no effect. /// /// /// Text to add as a child. /// void IAddChild.AddText (string text) { // Verify Context Access VerifyAccess(); XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this); } internal sealed override void Seal() { if (IsSealed) { return; } // Process the _setters collection: Copy values into PropertyValueList and seal the Setter objects. ProcessSettersCollection(_setters); // Freeze the value for the trigger StyleHelper.SealIfSealable(_value); // Build conditions array from collection TriggerConditions = new TriggerCondition[] { new TriggerCondition( _binding, LogicalOp.Equals, _value) }; // Set Condition for all data triggers for (int i = 0; i < PropertyValues.Count; i++) { PropertyValue propertyValue = PropertyValues[i]; propertyValue.Conditions = TriggerConditions; switch (propertyValue.ValueType) { case PropertyValueType.Trigger: propertyValue.ValueType = PropertyValueType.DataTrigger; break; case PropertyValueType.PropertyTriggerResource: propertyValue.ValueType = PropertyValueType.DataTriggerResource; break; default: throw new InvalidOperationException(SR.Get(SRID.UnexpectedValueTypeForDataTrigger, propertyValue.ValueType)); } // Put back modified struct PropertyValues[i] = propertyValue; } base.Seal(); } // evaluate the current state of the trigger internal override bool GetCurrentState(DependencyObject container, UncommonFielddataField) { Debug.Assert( TriggerConditions != null && TriggerConditions.Length == 1, "This method assumes there is exactly one TriggerCondition." ); return TriggerConditions[0].ConvertAndMatch(StyleHelper.GetDataTriggerValue(dataField, container, TriggerConditions[0].Binding)); } private BindingBase _binding; private object _value = DependencyProperty.UnsetValue; private SetterBaseCollection _setters = null; public static void ReceiveMarkupExtension(object targetObject, XamlSetMarkupExtensionEventArgs eventArgs) { if (targetObject == null) { throw new ArgumentNullException("targetObject"); } if (eventArgs == null) { throw new ArgumentNullException("eventArgs"); } DataTrigger trigger = targetObject as DataTrigger; if (trigger != null && eventArgs.Member.Name == "Binding" && eventArgs.MarkupExtension is BindingBase) { trigger.Binding = eventArgs.MarkupExtension as BindingBase; eventArgs.Handled = true; } else { eventArgs.CallBase(); } } } } // 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
- VideoDrawing.cs
- TextElementEditingBehaviorAttribute.cs
- StructuralType.cs
- NullableLongAverageAggregationOperator.cs
- MouseOverProperty.cs
- GiveFeedbackEvent.cs
- DataGridHelper.cs
- ConversionContext.cs
- UIElementIsland.cs
- XmlCountingReader.cs
- EntityModelSchemaGenerator.cs
- ScalarConstant.cs
- Base64Encoder.cs
- RegexRunner.cs
- HtmlInputImage.cs
- EntityDataReader.cs
- NavigationEventArgs.cs
- StylusPointPropertyUnit.cs
- NodeLabelEditEvent.cs
- Setter.cs
- SmtpSection.cs
- Char.cs
- SQLConvert.cs
- DSASignatureFormatter.cs
- Clock.cs
- TextBoxBase.cs
- DbConnectionPool.cs
- DocumentAutomationPeer.cs
- PasswordBoxAutomationPeer.cs
- SupportsEventValidationAttribute.cs
- WorkflowInstanceExtensionManager.cs
- Queue.cs
- SessionPageStateSection.cs
- TemplatedMailWebEventProvider.cs
- InitializingNewItemEventArgs.cs
- safex509handles.cs
- SmiXetterAccessMap.cs
- GACIdentityPermission.cs
- ContextProperty.cs
- SymmetricKeyWrap.cs
- TextDecoration.cs
- Util.cs
- LocalTransaction.cs
- SystemKeyConverter.cs
- AnnotationHelper.cs
- HtmlButton.cs
- UserControl.cs
- TransformCollection.cs
- OdbcPermission.cs
- SmtpReplyReader.cs
- TrackingCondition.cs
- TabletCollection.cs
- HttpAsyncResult.cs
- BasePropertyDescriptor.cs
- GacUtil.cs
- ManagedFilter.cs
- ComNativeDescriptor.cs
- ScalarOps.cs
- TextRunCache.cs
- AnimationTimeline.cs
- TCEAdapterGenerator.cs
- PopupRoot.cs
- SqlStream.cs
- UnorderedHashRepartitionStream.cs
- namescope.cs
- AssemblyName.cs
- InternalSafeNativeMethods.cs
- RequestQueue.cs
- IndexOutOfRangeException.cs
- LoginUtil.cs
- DispatchChannelSink.cs
- ToolStripStatusLabel.cs
- XmlToDatasetMap.cs
- ModelTreeEnumerator.cs
- CompatibleComparer.cs
- HealthMonitoringSectionHelper.cs
- ClientTargetSection.cs
- SecuritySessionSecurityTokenProvider.cs
- Knowncolors.cs
- InvokePattern.cs
- ResetableIterator.cs
- PropertyCollection.cs
- SqlFacetAttribute.cs
- XamlTemplateSerializer.cs
- ToolStripDropDownItem.cs
- VirtualizedContainerService.cs
- ToolStripOverflow.cs
- TaiwanLunisolarCalendar.cs
- HierarchicalDataBoundControlAdapter.cs
- DynamicUpdateCommand.cs
- EntityViewContainer.cs
- Icon.cs
- ParsedAttributeCollection.cs
- PeerToPeerException.cs
- EntityWrapperFactory.cs
- TemplateInstanceAttribute.cs
- WaitHandleCannotBeOpenedException.cs
- StateManagedCollection.cs
- WebHttpBindingElement.cs
- XPathAncestorQuery.cs