2011-01-13 28 views
4

的再驗證我有綁定到屬性MinCartValue和MaxCartValue兩個對照。 MinCartValue必須小於MaxCartValue。爲了實現這種驗證,我已經實現了IDataErrorInfo接口,並且如果觸及了MinCartValue或MaxCartValue,則在此[columnName]方法中運行上述檢查。 ValidatesOnDataErrors = True在兩個控件的綁定中設置。 驗證工作正常,當對其屬性值的更改違反規則時突出顯示每個控件。問題是,一旦控件被標記爲無效,如果用戶通過更改其他控件的值來糾正問題,則第一個控件將保持標記爲無效。這是可以理解的,因爲IDataErrorInfo方法沒有對第一個控件的屬性進行驗證。S/L 4&IDataErrorInfo的 - 如何強制控制(當相關的控制被觸摸)

所以我需要的是一種強制性質#1被重新驗證(或方法來清除無效的狀態)時,性能#2被驗證,反之亦然。我曾嘗試在我的[columnName]方法中調用RaisePropertyChanged,但它什麼都不做。也嘗試將屬性設置爲自己的值來試圖欺騙它來驗證自己,但是再次沒有任何反應。

感謝

回答

2

我會建議看INotifyDataErrorInfo接口(在Silverlight 4中引入)。如果屬性變得無效,它可以異步通知,所以我認爲框架更好地尊重許多屬性,而不是期望當前正在更改的屬性是唯一一個有效性可能發生變化的屬性。

+0

好的,我會看看這個。 – Laurence 2011-01-15 15:18:43

+0

爲什麼哦爲什麼`INotifyDataErrorInfo`不在WPF中?這樣一個有用的界面! – 2011-02-18 12:19:38

0

我不知道如果我恰好認識你的問題,但也許這可能會有幫助。提供一些示例XAML和綁定屬性代碼會有所幫助。

這聽起來像取決於默認UpdateSourceTrigger,這在TextBox控件的情況下,是他們的重點/無焦點的你的代碼的問題。您可以在XAML中設置UpdateSourceTrigger屬性,方法是將UpdateSourceTrigger = Explicit添加到發生驗證的綁定中。然後在每個TextBox(MinCartValue,MaxCartValue)中,向TextChanged事件添加一個事件處理程序。

在事件處理程序的代碼隱藏,你可以做這樣的事情:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     TheTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 

TheTextBox在這種情況下將是你的車的控件之一。 UpdateSource()方法是一種手動更新綁定值的方法,該方法會觸發您的驗證。此方法提供了綁定到觸發器以更新值並且引發屬性在默認範圍之外更改的情況(在此實例中使用文本更改的焦點集中和未着重於TextBox)。

+0

謝謝。我應該提到我使用MVVM方法,其中「後面的代碼」沒有對XAML控件的引用。我想堅持這一點,所以我只想通過引用充當數據上下文的對象的屬性來尋找一種方法。 – Laurence 2011-01-15 15:18:26

+0

是的,我不知道你是否使用MVVM。我嘗試自己關注MVVM,但是我不幸想出了一個很好的解決這個問題的MVVM解決方案。 – avanek 2011-01-17 14:16:13

0

這裏是我如何解決它。假設Property1和Property2是相關的。我對MVVM還不熟悉,但是您可能會擴展您的實體類以實現IDataErrorInfo。在這種情況下,你也可以延長在相互依存的性質[屬性]更改方法和報告變化:

partial class YourEntity : IDataErrorInfo 
{ 
    public string this[string columnName] 
     { 
      //Your validation logic 
     } 

    public string Error 
    { 
     //WPF doesn't use it anyway 
     get { return string.Empty; } 
    } 

    partial void OnProperty1Changed() 
    { 
     OnPropertyChanging("Property2"); 
     OnPropertyChanged("Property2"); 
    } 

    partial void OnProperty2Changed() 
    { 
     OnPropertyChanging("Property1"); 
     OnPropertyChanged("Property1"); 
    } 
} 

在這種情況下,更新的這兩種屬性之一,使重新評估自己都綁定控件。

EDIT2:看來你應該使用OnPropertyChang *而不是ReportPropertyChang *。 ReportPropertyChanged會通知實體框架模型中有未決的變化,但實際上你所要做的只是通知視圖。你不想用沒有真正改變的屬性來更新數據庫。 ReportPropertyChang *也將在數據庫中沒有映射的計算字段上失敗。編輯1:發現在ReportPropertyChanged之前調用ReportPropertyChanging是必不可少的。

1

我有兩個需要互相驗證的DateTime屬性(DateFrom和DateTo)。在這些屬性的setter中,我只是爲DateTo和DateFrom引發了一個PropertyChanged事件。像魅力一樣工作。