由於ValidationRule
不會從DependencyObject
繼承,因此無法在自定義ValidationRule類中定義DependencyProperty
並將其綁定到相應的UI元素。
不過,我能想到的解決方案,可幫助您解決問題:
你仍然可以在自定義有效性規則類中定義的字符串屬性(比如TargetUINameString
)並將其設置爲每個UI元素這樣的名字:
<TextBox Name="textbox1"...
<c:MyValidationRule TargetUINameString="textbox1"/>
...
靜態屬性(比如ActiveInstanceOfThis
)從添加到您的窗口,它授予您訪問窗口類的活動實例。 (它在窗口的構造函數中設置爲this
)
然後使用FindName解決這個問題:
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value==null)
{
var uielement =
Window1.ActiveInstanceOfThis.stackPanel1.FindName(TargetUINameString)
as TextBox;
if(uielement!=null) uielement.Focus();
}
}
這是一個有點髒,但它的工程!