Как MultiDataTrigger узнает, когда условие в его коллекции ConditionCollection обновляется? - PullRequest
1 голос
/ 21 июня 2011

Я пытаюсь, чтобы поведение имело коллекцию ConditionCollection, похожую на MultiDataTrigger.Я просмотрел отраженный код, но не могу понять, как 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 Ответ

2 голосов
/ 21 июня 2011

В принципе, это не так. Существует внутренний класс StyleHelper, который определяет, когда следует переоценивать триггеры. Это делается на основе различных привязок в триггерах.

В частности, вы можете посмотреть на StyleHelper. Метод EvaluateOldNewStates, который принимает MultiDataTrigger.

...