如何创建只读布尔依赖项属性,该属性在两个其他依赖项属性之间返回“And”操作

时间:2010-11-07 11:29:09

标签: c# wpf dependency-properties

如何创建自定义只读布尔依赖项属性,该属性在两个自定义布尔依赖项属性之间返回And操作,例如(A,B),

当A或B发生变化时,我希望触发结果属性。

任何有助于实现这一目标的帮助!

2 个答案:

答案 0 :(得分:5)

第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);

答案 1 :(得分:3)

你可以通过定义你的两个依赖属性AB(为了这个例子,我猜),并定义一个回调,只要这些变化,使用{{ 3 {}在PropertyMetaData构造函数中。在此回调中,只需执行所需的计算,并将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);
        }
    }
}