通过我自己的代码检测DependencyProperty的更改

时间:2014-10-21 11:05:41

标签: c# .net wpf dependency-properties

我的控件有一个映射到私有变量的属性。设置属性后,我还需要存储某个其他变量。当属性的私有变量由我自己的控制代码设置时,不得进行此特殊处理。一切都好。

我现在需要将它重构为DependencyProperty。我这里只有一个更改处理程序,并且对该属性的所有(也是内部)访问必须通过DependencyProperty框架。没有我可以直接设置的私有变量。现在,我自己的代码所做的每一项更改都与外部源(例如控件或DataBinding的用户)的更改完全相同。

在我的属性更改处理程序中,如何确定值更改是来自我的代码还是其他地方?

这是旧代码:

private DateTime selectedTime;
private int intendedDay;

public DateTime SelectedTime
{
    get { return selectedTime; }
    set
    {
        selectedTime = value;
        intendedDay = selectedTime.Day;
    }
}

在此代码中,我可以直接设置selectedTime,而不会影响intendedDaySelectedTime只能在public static DependencyProperty SelectedTimeProperty = DependencyProperty.Register( "SelectedTime", typeof(DateTime), typeof(DateTimeTextBox), new PropertyMetadata(SelectedTimeChanged)); public DateTime SelectedTime { get { return (DateTime) GetValue(SelectedTimeProperty); } set { SetValue(SelectedTimeProperty, value); } } private static void SelectedTimeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { DateTimeTextBox control = (DateTimeTextBox) obj; // This must not happen where I previously assigned the private variable: control.intendedDay = control.SelectedTime.Day; } private int intendedDay; 从外部完全分配新值时设置,或者当我认为合适时在我的掌控之中。

DependencyProperty只允许我检测任何更改:

intendedDay

所以当我以前分配私有变量时,我现在只能设置依赖属性,它也会改变{{1}}。

2 个答案:

答案 0 :(得分:0)

为什么不将依赖属性包装在普通属性中?设置属性仍将设置依赖项属性,而设置私有属性将不会设置expectedDay值。

private DateTime selectedTime
{
    get { return (DateTime) GetValue(SelectedTimeProperty); }
    set { SetValue(SelectedTimeProperty, value); }
}

public DataTime SelectedTime
{
    get { return selectedTime; }
    set
    {
        selectedTime = value;
        intendedDay = selectedTime.Day;
    }
}

答案 1 :(得分:0)

就像Clemens在评论中解释的那样,我添加了一个私有变量,指示我当前是否正在从我自己的代码中更新该属性。每当我想要抑制外部值更改处理时,我将其设置为true,之后将其设置为false。所以我可以区分它是内部还是外部的价值变化。