2014-01-14 19 views
2

我有一個WPF用戶控件與幾個DependencyProperties。如何知道我的DependencyProperty是否設置爲NULL?

如果用戶將「null」綁定到我的一個DependencyProperties,我希望能夠做些事情,例如將值更改爲有效的值。

問題是我的屬性的默認值爲NULL,並且當它們將NULL設置爲該屬性時,OnPropertyChanged不會觸發。

有沒有一種方法可以實現我想要的功能,而不是將我的屬性的默認值更改爲NULL以外的其他值?我需要創建一些「模擬」值設置爲默認

回答

6

區分註冊您的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); 
0

這聽起來像你試圖區分默認值和明確的用戶值,但兩個值是相同的:null。這是不可能的,因爲事件是基於價值的,並且如果價值沒有改變,事件不會發生。這聽起來像你應該考慮選擇一個不同於null不同的默認值。這將允許你在兩種狀態

+0

你是正確的如果*強制*用戶值與默認值相同,則'PropertyChangedCallback'不會觸發,但您的結論是錯誤的。他可以將'null'區分爲默認值或用戶值,因爲默認值永遠不會傳遞給'CoerceValueCallback',而用戶值將會(即使它與當前的默認值匹配)。 –

+0

對於它的價值,'DependencyPropertyHelper.GetValueSource(obj,dp).BaseValueSource == BaseValueSource.Local'將決定它是否是用戶設置的,但是仍然沒有辦法捕捉它被設置的事實,如果舊的和新的價值是相同的。儘管你可以在控件的'Initialized'事件上執行這個檢查。 – nmclean

+0

@nmclean我不確定你的意思,「如果新舊值相同,仍然沒有辦法捕捉到它的設置」。即使您沒有采取其他措施,您也可以觀察強制回調中的設置操作。設置時總是會被調用(但不會被清除,或者只有一個默認值)。即使建議值與當前有效值相匹配,它也會被調用。 –

0

您可以嘗試DependencyProperty.Register與驗證回調

+3

不幸的是*驗證回調存儲在依賴項屬性標識符上,而不是依賴項屬性元數據中。您的驗證回調無法訪問設置了該屬性的DependencyObject的特定實例,並且只能影響該屬性通常接受的值。如果您需要可以根據特定實例更改屬性值的回調,則應該使用CoerceValueCallback和PropertyChangedCallback的組合。*從備註[此處](http://msdn.microsoft.com/zh-cn/library /system.windows.validatevaluecallback.aspx)。 – Clemens

相關問題