У меня есть ситуация, когда я использую привязку и проверку данных wpf с помощью ExceptionValidationRule.
Другая часть решения включает в себя сворачивание одних панелей и отображение других.
Если установлено исключение проверки - то есть пользовательский интерфейс показывает красную рамку вокруг элемента пользовательского интерфейса с проблемой проверки, и содержащая панель свернута, красная граница по-прежнему отображается. Это явно не должно быть? Есть ли обходной путь для этого? Кто-нибудь знает, если это по замыслу?
Приведен пример минимального кода (не мой настоящий код, но повторяет проблему). Создайте новое приложение WpfApplication (я назвал его WpfDataBindingProblem).
xaml для window1 выглядит следующим образом:
<Window x:Class="WpfDataBindingProblem.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel Margin="5">
<StackPanel Name="panel1" Visibility="Visible" Margin="5">
<TextBox Name="DataBoundTextBox">
<Binding Path="TextValue">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox>
</StackPanel>
<StackPanel Name="panel2" Visibility="Collapsed" Margin="5">
<TextBlock>
The quick brown fox jumps over the lazy dog.
</TextBlock>
</StackPanel>
<Button Click="Button_Click" Margin="5">
Toggle panels
</Button>
</StackPanel>
</Window>
Код для 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);
}
}
}
}
Чтобы воспроизвести проблему, запустите приложение. Удалите текст по умолчанию из текстового поля, а вкладка не отображается - отображается красный прямоугольник, указывающий на проблему с проверкой. Нажмите на кнопку. Панель, содержащая элемент управления с красным прямоугольником, скрыта, и отображается другая панель, но красный прямоугольник остается. Aargh!
Вся помощь очень ценится.
PS извиняюсь за длинное название вопроса!