代码之家  ›  专栏  ›  技术社区  ›  Homam

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

  •  3
  • Homam  · 技术社区  · 14 年前

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

    任何帮助都可以!

    2 回复  |  直到 14 年前
        1
  •  5
  •   Vlad    11 年前

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

    免责声明:我没有试第二部分。

    第3部分:
    如果源依赖项属性不是由您定义的,则可以执行以下技巧:

    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(
            MyControl.Source1Property,
            typeof(MyControl)));
    if (dpd != null)
        dpd.AddValueChanged(this, UpdateTarget);
    
        2
  •  3
  •   driis    14 年前

    您可以通过定义两个依赖项属性来执行此操作 A B (为了示例的缘故,我想),并定义一个回调函数,在这些更改发生时执行,使用 PropertyMetaData DependencyProperty Result 该值的Depdency属性。下面是一个工作示例:

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