当我的wpf绑定validation失败并且包含的​​面板不再可见时,如何摆脱红色矩形?

我有一种情况,我使用ExceptionValidationRule使用wpf数据绑定和validation。

解决方案的另一部分invovles折叠一些面板并显示其他面板。

如果设置了validationexception – 即UI在UI元素周围显示带有validation问题的红色边框,并且包含的​​面板已折叠,则仍会显示红色边框。 这显然不是意味着什么? 这有解决方法吗? 任何人都知道这是否是设计的?

提供最小代码示例(不是我的实际代码,但复制问题)。 创建一个新的WpfApplication(我称之为WpfDataBindingProblem)。

window1的xaml如下:

             The quick brown fox jumps over the lazy dog.      

window1的代码如下:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfDataBindingProblem { public partial class Window1 : Window { public Window1() { InitializeComponent(); this.DataContext = new MyClass("default"); } private void Button_Click(object sender, RoutedEventArgs e) { panel1.Visibility = panel1.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; panel2.Visibility = panel2.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; } } public class MyClass : INotifyPropertyChanged { private string mTextValue; public MyClass(string defaultText) { TextValue = defaultText; } public string TextValue { get { return mTextValue; } set { mTextValue = value; if (string.IsNullOrEmpty(mTextValue)) { throw new ApplicationException("Text value cannot be empty"); } OnPropertyChanged(new PropertyChangedEventArgs("TextValue")); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { if (this.PropertyChanged != null) { this.PropertyChanged(this, e); } } } } 

要重现该问题,请运行该应用程序。 从文本框和选项卡中删除默认文本 – 显示红色矩形表示validation问题。 单击按钮。 隐藏包含红色矩形控件的面板,显示另一个面板,但红色矩形仍然存在。 AARGH!

所有人都非常感谢。

PS道歉很长的问题!

如果我没记错的话,这是一个众所周知的问题。 我们重新模板化文本框以包含以下内容:

               

我自己有一个问题的答案,就是改变我的按钮点击事件,这会改变面板的可见性。 这将改为这样的事情:

 private void Button_Click(object sender, RoutedEventArgs e) { if (panel1.Visibility == Visibility.Collapsed) { panel1.Visibility = Visibility.Visible; DataBoundTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); panel2.Visibility = Visibility.Collapsed; } else { panel1.Visibility = Visibility.Collapsed; DataBoundTextBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); panel2.Visibility = Visibility.Visible; } } 

UpdateSource()UpdateTarget()具有重新应用和删除红色矩形的效果,但这似乎是一个丑陋的黑客。 当包含面板折叠时,wpf框架应该为我隐藏红色矩形。 任何不需要我摆弄绑定表达式的清洁修复都会得到我的投票。

谢谢,

山姆