WPF 유효성 검사 시스템은 개체의 초기 유효성 검사를 수행합니다. 즉, 데이터 바인딩 된 항목이 변경되고 결과가 UI에 표시 될 때 모든 필드의 유효성이 검사됩니다. 그러나 컨트롤을 동적으로 추가 할 때 이렇게 작동하지 않습니다. 그런 경우에는 초기 유효성 검사가 수행되지만 결과는 UI에 표시되지 않습니다. 데이터 바인딩 된 객체의 일부 속성이 변경된 후에 만 모든 것이 올바르게 작동하기 시작합니다. 여기에 샘플이 있습니다.동적으로 추가 된 컨트롤의 초기 유효성 확인
한다고 가정 우리가 MyObject를 클래스
public class MyObject : INotifyPropertyChanged, IDataErrorInfo
{
public string Name { /*get, set implementation */}
// IDataErrorInfo
public string this[string columnName]
{
get
{
if (String.IsNullOrEmpty(Name)) return "Name can't be empty!";
return String.Empty;
}
}
/* etc. */
}
그리고 일부 사용자 제어가, MyObject를 객체의 편집을 허용을 MyUserControl는 말한다. 은 다음과 같이 어떻게 든 찾아보실 수 있습니다 :
<UserControl x:Class="Test.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name: "/>
<TextBox Text="{Binding Name, ValidatesOnDataErrors=True}" Width="200"/>
</StackPanel>
</UserControl>
을 지금,이 컨트롤은 XAML에서 메인 창에 추가 될 때 (또는 뒤에 생성자 또는 창로드 이벤트에서 코드) MyCustomControl.DataContext를 새로 설정되어있는 경우에 비해 MyObject 클래스의 인스턴스에서 이름 필드의 유효성이 즉시 검사되고 유효성 검사 오류 템플릿을 사용하여 오류 알림이 표시됩니다. MyCustomControl 동적 (이후, 말, 버튼을 클릭)를 첨가 때, 초기 검증이 발생 결과를 표시하지 않습니다 UI (NO 빨간색 테두리 등)
dockpanel로 구성되어 해당 응용 프로그램 창을 가정 (dockPanel)하고 있지만, 버튼 :
public Window1()
{
InitializeComponent();
button.Click +=new RoutedEventHandler(OnButtonClick);
/*
// in this case validation works correctly,
// when window is shown Name textbox already got a red border etc.
var muc = new MyUserControl();
dockPanel.Children.Add(muc);
muc.DataContext = new MyObject();
*/
}
private void OnButtonClick(object sender, RoutedEventArgs e)
{
// in this case validatation works, but no results are shown on the ui
// only after Name property is changed (then removed again) red border appears
var muc = new MyUserControl();
dockPanel.Children.Add(muc);
muc.DataContext = new MyObject();
}
왜?