Как создать булево свойство зависимости только для чтения, которое возвращает операцию `И` между двумя другими свойствами зависимости - PullRequest
3 голосов
/ 07 ноября 2010

Как создать собственное свойство логической зависимости, доступное только для чтения, которое возвращает операцию And между двумя настраиваемыми свойствами логической зависимости, например (A, B),

А при изменении A или B Iхотите, чтобы свойство результата срабатывало.

Любая помощь для достижения этой цели!

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

Часть 1: зависимости.

public static readonly DependencyProperty Source1Property =
    DependencyProperty.Register(
        "Source1",
        typeof(bool),
        typeof(MyControl),
        new FrameworkPropertyMetadata(false, new PropertyChangedCallback(UpdateTarget)));

public bool Source1
{
    get { return (bool)GetValue(Source1Property); }
    set { SetValue(Source1Property, value); }
}

void UpdateTarget(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyControl self = (MyControl)d;
    d.Target = d.Source1 && d.Source2;
}

Часть 2: только для чтения

internal static readonly DependencyPropertyKey TargetPropertyKey =
    DependencyProperty.RegisterReadOnly(
        "Target",
        typeof(bool),
        typeof(MyControl),
        new PropertyMetadata(false));

public static readonly DependencyProperty TargetProperty =
    TargetPropertyKey.DependencyProperty;

public bool Target
{
    get { return (bool)GetValue(TargetProperty); }
    protected set { SetValue(TargetPropertyKey, value); }
}

Отказ от ответственности: я не пробовал часть 2.

Часть 3:
если свойства исходной зависимости не определены вами, вы можете сделать следующий трюк:

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(
        MyControl.Source1Property,
        typeof(MyControl)));
if (dpd != null)
    dpd.AddValueChanged(this, UpdateTarget);
3 голосов
/ 07 ноября 2010

Вы можете сделать это, определив два свойства зависимости A и B (для примера, я полагаю) и определить обратный вызов, который будет выполняться при каждом изменении, используя PropertyMetaData в конструкторе DependencyProperty . В этом обратном вызове просто выполните необходимое вычисление и установите для свойства Result depdendency это значение. Вот рабочий пример:

public class Data : DependencyObject
{
    public static readonly DependencyProperty AProperty = DependencyProperty.Register("A", typeof(Boolean), typeof(Data), new PropertyMetadata(false,HandleValueChanged));
    public static readonly DependencyProperty BProperty = DependencyProperty.Register("B", typeof(Boolean), typeof(Data), new PropertyMetadata(false, HandleValueChanged));
    public static readonly DependencyProperty ResultProperty = DependencyProperty.Register("Result",typeof (Boolean), typeof (Data));

    private static void HandleValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        d.SetValue(ResultProperty, ((Data)d).Result);
        Debug.WriteLine("Value change");
    }

    public bool Result
    {
        get { return A & B; }
    }

    public bool A
    {
        get { return (bool) GetValue(AProperty); }
        set
        {
            if ( A != value )
                SetValue(AProperty, value);
        }
    }
    public bool B
    {
        get
        {
            return (bool) GetValue(BProperty);
        }
        set
        {
            if (B != value)
                SetValue(BProperty, value);
        }
    }
}
...