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

时间:2011-06-21 13:54:24

标签: c# wpf datatrigger multidatatrigger

我正在尝试使一个行为具有类似于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;
    }
}

}

1 个答案:

答案 0 :(得分:2)

基本上,它没有。有一个内部StyleHelper类,它确定何时重新评估触发器。它基于触发器中的各种绑定来完成此任务。

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