MultiDataTrigger如何知道其ConditionCollection中的Condition何时更新

本文关键字:Condition 何时 更新 中的 ConditionCollection 何知道 MultiDataTrigger | 更新日期: 2023-09-27 17:59:41

我正在尝试使一个行为具有类似于MultiDataTrigger的ConditionCollection。我已经查看了反映的代码,但我似乎无法理解MultiDataTrigger是如何知道何时通过它的逻辑来确定是否满足条件的。

这是代码:

[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;
    }
}

}

MultiDataTrigger如何知道其ConditionCollection中的Condition何时更新

基本上没有。有一个内部StyleHelper类,用于确定何时重新评估触发器。它是根据触发器中的各种绑定来执行此操作的。

具体来说,您可以查看StyleHelper。EvaluateOldNewStates方法,该方法采用MultiDataTrigger。