Я реализовал IDataErrorInfo для обработки ошибок проверки. Gridcell становится текстовым блоком при наличии ошибок проверки.
Код: C #
public class Customer :IDataErrorInfo, INotifyPropertyChanged
{
private string sample;
private string testpcode;
public string SampleCode
{
get { return sample; ; }
set { sample = value; OnPropertyChanged(SampleCode); }
}
public string TestPCode
{
get { return testpcode; }
set { testpcode = value; OnPropertyChanged(TestPCode); }
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
public string Error
{
get
{
StringBuilder sb = new StringBuilder();
sb.Append(CheckCode());
return sb.ToString();
}
}
private string CheckCode()
{
if (string.IsNullOrWhiteSpace(this.SampleCode))
{
return ("The sample code can't be empty");
}
return string.Empty;
}
public string this[string columnName]
{
get
{
switch (columnName)
{
case "SampleCode":
return CheckCode();
}
return string.Empty;
}
}
}
Код Xaml ниже для этого пользовательского интерфейса:
<Window.Resources>
<ControlTemplate x:Key="ErrorTemplate">
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid x:Name="grid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="20"/>
<RowDefinition Height="5"/>
<RowDefinition Height="Auto" MinHeight="20"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Click="AddButton_Click" Grid.Row="0" Grid.Column="0" Content="Add"/>
<Button Click="DeleteButton_Click" Grid.Row="0" Grid.Column="1" Content="Delete"/>
<DataGrid x:Name="dataGrid" Grid.Row="2" ScrollViewer.VerticalScrollBarVisibility="Visible" ItemsSource="{Binding ItemsCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding SampleCode, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}"/>
<DataGridTextColumn Binding="{Binding TestPCode}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Добавьте новую строку, нажав кнопку Добавить, и отредактируйте ячейку новой добавленной строки. Затем удалите выбранный элемент. Гриселл становится TextBlock. Невозможно что-либо редактировать.