2011-06-21 20 views
1

我試圖讓行爲有一個類似於MultiDataTrigger的ConditionCollection。我查看了反射代碼,但我似乎無法跟蹤MultiDataTrigger如何知道何時通過它的邏輯來確定條件是否滿足。MultiDataTrigger如何知道ConditionCollection中的條件何時更新?

下面的代碼:

[ContentProperty("Setters")] 
public sealed class MultiDataTrigger : TriggerBase, IAddChild 
{ 
// Fields 
private ConditionCollection _conditions = new ConditionCollection(); 
private SetterBaseCollection _setters; 

// Methods 
internal override bool GetCurrentState(DependencyObject container, UncommonField<HybridDictionary[]> dataField) 
{ 
    bool flag = base.TriggerConditions.Length > 0; 
    for (int i = 0; flag && (i < base.TriggerConditions.Length); i++) 
    { 
     flag = base.TriggerConditions[i].ConvertAndMatch(StyleHelper.GetDataTriggerValue(dataField, container, base.TriggerConditions[i].Binding)); 
    } 
    return flag; 
} 

internal override void Seal() 
{ 
    if (!base.IsSealed) 
    { 
     base.ProcessSettersCollection(this._setters); 
     if (this._conditions.Count > 0) 
     { 
      this._conditions.Seal(ValueLookupType.DataTrigger); 
     } 
     base.TriggerConditions = new TriggerCondition[this._conditions.Count]; 
     for (int i = 0; i < base.TriggerConditions.Length; i++) 
     { 
      if ((this._conditions[i].SourceName != null) && (this._conditions[i].SourceName.Length > 0)) 
      { 
       throw new InvalidOperationException(SR.Get("SourceNameNotSupportedForDataTriggers")); 
      } 
      base.TriggerConditions[i] = new TriggerCondition(this._conditions[i].Binding, LogicalOp.Equals, this._conditions[i].Value); 
     } 
     for (int j = 0; j < this.PropertyValues.Count; j++) 
     { 
      PropertyValue value2 = this.PropertyValues[j]; 
      value2.Conditions = base.TriggerConditions; 
      switch (value2.ValueType) 
      { 
       case PropertyValueType.Trigger: 
        value2.ValueType = PropertyValueType.DataTrigger; 
        break; 

       case PropertyValueType.PropertyTriggerResource: 
        value2.ValueType = PropertyValueType.DataTriggerResource; 
        break; 

       default: 
        throw new InvalidOperationException(SR.Get("UnexpectedValueTypeForDataTrigger", new object[] { value2.ValueType })); 
      } 
      this.PropertyValues[j] = value2; 
     } 
     base.Seal(); 
    } 
} 

void IAddChild.AddChild(object value) 
{ 
    base.VerifyAccess(); 
    this.Setters.Add(Trigger.CheckChildIsSetter(value)); 
} 

void IAddChild.AddText(string text) 
{ 
    base.VerifyAccess(); 
    XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this); 
} 

// Properties 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public ConditionCollection Conditions 
{ 
    get 
    { 
     base.VerifyAccess(); 
     return this._conditions; 
    } 
} 

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public SetterBaseCollection Setters 
{ 
    get 
    { 
     base.VerifyAccess(); 
     if (this._setters == null) 
     { 
      this._setters = new SetterBaseCollection(); 
     } 
     return this._setters; 
    } 
} 

}

回答

2

基本上,它沒有。有一個內部的StyleHelper類,它決定了何時重新評估觸發器。它基於觸發器中的各種綁定來完成此操作。

具體來說,你可以看看StyleHelper。使用MultiDataTrigger的EvaluateOldNewStates方法。

相關問題