2010-06-24 7 views
1

我已經搜索了互聯網並且尚未找到解決方案。幫助我Stack-Overflow-Kenobi,你是我唯一的希望!Silverlight:ComboBox上的雙向綁定不會碰到BindingValidationError處理程序與null

所以我有這個Silverlight應用程序,對不對?我有一個綁定到不可爲空的數據庫字段的組合框,以便在初始化時填充所有可能的值。在這方面它工作得很好。

但是,當我SubmitChanges沒有選擇一個項目,沒有驗證錯誤拋出,所以我的BindingValidationError處理程序永遠不會被激活。現在我期望(並且有點需要)將null推入非空數據庫列時會引發錯誤。這樣用戶知道選擇一個項目。

當值不爲空時,它被推送到數據庫就好了。基本上,綁定工作正常:我只需要知道爲什麼沒有命中BindingValidationError處理程序。如果沒有選擇項目,則需要運行ToggleError。

foo() 
{ 
    Binding databinding = new Binding(this.Id); 

    databinding.Source = bindingObject; 
    databinding.BindsDirectlyToSource = true; 
    databinding.Mode = BindingMode.TwoWay; 
    databinding.ValidatesOnDataErrors = true; 
    databinding.ValidatesOnExceptions = true; 
    databinding.ValidatesOnNotifyDataErrors = true; 
    databinding.NotifyOnValidationError = true; 
    databinding.UpdateSourceTrigger = UpdateSourceTrigger.Default; 

    CmbBox.DisplayMemberPath = _DisplayMemberPath; 
    CmbBox.SelectedValuePath = _SelectedValuePath; 
    CmbBox.SetBinding(ComboBox.SelectedItemProperty, databinding); 
    CmbBox.BindingValidationError += (sender, e) => ToggleError(e.Action == ValidationErrorEventAction.Added ? true : false , e.Error.ErrorContent.ToString()); 
} 

private void ToggleError(bool enableError, string errorMessage) 
{ 
    hasError = enableError; 
    if (hasError) 
    { 
     CmbBox.Foreground = new SolidColorBrush(Utilities.DarkRed); 
     Error.Visibility = Visibility.Visible; 
     this.errorMessage = errorMessage; 
    } 
    else 
    { 
     CmbBox.Foreground = new SolidColorBrush(Utilities.DarkGreen); 
     Error.Visibility = Visibility.Collapsed; 
     errorMessage = null; 
    } 
} 

預先感謝:)

卡梅倫

回答

1

當雙向綁定更新和setter方法拋出一個異常的BindingValidationError事件觸發。如果您從不選擇ComboBox的值,那麼綁定從不更新,並且永遠不會拋出錯誤。在致電SubmitChanges之前,您需要自行驗證。

如果您使用的是Silverlight 4,您可能需要考慮使用INotifyDataErrorInfo在您的代碼中進行驗證,然後更新UI以顯示驗證錯誤。