自定义依赖属性仅触发一次

时间:2014-02-18 13:48:30

标签: wpf dependency-properties

我在自定义用户控件上创建了一个依赖项属性,问题是" OnPeriodTypeChangedHandler"属性更改回调仅在第一次创建控件时触发一次,随后如果我尝试通过绑定调用属性,则根本不会触发。有什么想法吗?

#region PeriodType
    public static readonly DependencyProperty PeriodTypeProperty =
         DependencyProperty.Register(
            "PeriodType",
            typeof(PeriodTypeEnum),
            typeof(Period),
            new FrameworkPropertyMetadata(
                PeriodTypeEnum.None,
                FrameworkPropertyMetadataOptions.AffectsRender,
                new PropertyChangedCallback(OnPeriodTypeChangedHandler)
            )
    );

    public static void OnPeriodTypeChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        // Get instance of current control from sender
        // and property value from e.NewValue

        // Set public property on TaregtCatalogControl, e.g.
        ((Period)sender).PeriodType = (PeriodTypeEnum)e.NewValue;
        if ((PeriodTypeEnum)e.NewValue == PeriodTypeEnum.Month)
            ((Period)sender).Periods = ((Period)sender).GetMonthlyPeriods();
        if ((PeriodTypeEnum)e.NewValue == PeriodTypeEnum.Quarter)
            ((Period)sender).Periods = ((Period)sender).GetQuarterlyPeriods();
    }

    public PeriodTypeEnum PeriodType
    {
        get 
        {
            return (PeriodTypeEnum)GetValue(PeriodTypeProperty); 
        }
        set 
        { 
            SetValue(PeriodTypeProperty, value);                
        }
    }

    #endregion

2 个答案:

答案 0 :(得分:3)

如果您希望DP默认绑定TwoWay,您可以使用FrameworkPropertyMetadataOptions.BindsTwoWayByDefault在DP注册时指定它。这样,您无需在绑定时将模式设置为TwoWay。

    public static readonly DependencyProperty PeriodTypeProperty =
     DependencyProperty.Register(
        "PeriodType",
        typeof(string),
        typeof(MyTextBox),
        new FrameworkPropertyMetadata(
            PeriodTypeEnum.None,
            FrameworkPropertyMetadataOptions.AffectsRender
               | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, <- HERE
            new PropertyChangedCallback(OnPeriodTypeChangedHandler)
        )
);

答案 1 :(得分:1)

我认为我在ViewModel中将Mode属性更改为“TwoWay”以获取其数据绑定属性,从而在此特定实例中找到了解决方案。