區分註冊您的DependencyProperty
時,您可以指定一個CoerceValueCallback
,並使用它時,你看到的null
基值來代替一個有效的值。默認值不會傳遞到CoerceValueCallback
,所以這幾乎是您區分作爲默認值或用戶值的null
的唯一選項。
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register(
"MyProperty",
typeof(object),
typeof(OwnerType),
new PropertyMetadata(default(object), null, CoerceMyProperty));
private static object CoerceMyProperty(DependencyObject d, object baseValue)
{
if (baseValue == null)
return SomeAlternateValue;
return baseValue;
}
如果你從來沒有分配MyProperty
,你會看到CoerceMyProperty
是從來沒有所謂的,但你的控件實例將有默認值(null
)。此外,考慮到以下兩行,CoerceMyProperty
會被調用爲先,而不是第二(這將恢復爲默認值):
this.MyProperty = null;
this.ClearValue(MyPropertyProperty);
你是正確的如果*強制*用戶值與默認值相同,則'PropertyChangedCallback'不會觸發,但您的結論是錯誤的。他可以將'null'區分爲默認值或用戶值,因爲默認值永遠不會傳遞給'CoerceValueCallback',而用戶值將會(即使它與當前的默認值匹配)。 –
對於它的價值,'DependencyPropertyHelper.GetValueSource(obj,dp).BaseValueSource == BaseValueSource.Local'將決定它是否是用戶設置的,但是仍然沒有辦法捕捉它被設置的事實,如果舊的和新的價值是相同的。儘管你可以在控件的'Initialized'事件上執行這個檢查。 – nmclean
@nmclean我不確定你的意思,「如果新舊值相同,仍然沒有辦法捕捉到它的設置」。即使您沒有采取其他措施,您也可以觀察強制回調中的設置操作。設置時總是會被調用(但不會被清除,或者只有一個默認值)。即使建議值與當前有效值相匹配,它也會被調用。 –