我的控件有一个映射到私有变量的属性。设置属性后,我还需要存储某个其他变量。当属性的私有变量由我自己的控制代码设置时,不得进行此特殊处理。一切都好。
我现在需要将它重构为DependencyProperty。我这里只有一个更改处理程序,并且对该属性的所有(也是内部)访问必须通过DependencyProperty框架。没有我可以直接设置的私有变量。现在,我自己的代码所做的每一项更改都与外部源(例如控件或DataBinding的用户)的更改完全相同。
在我的属性更改处理程序中,如何确定值更改是来自我的代码还是其他地方?
这是旧代码:
private DateTime selectedTime;
private int intendedDay;
public DateTime SelectedTime
{
get { return selectedTime; }
set
{
selectedTime = value;
intendedDay = selectedTime.Day;
}
}
在此代码中,我可以直接设置selectedTime
,而不会影响intendedDay
,SelectedTime
只能在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}}。
答案 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。所以我可以区分它是内部还是外部的价值变化。