Gridcell становится недоступным для редактирования при наличии ошибок проверки - PullRequest
1 голос
/ 17 октября 2019

Я реализовал IDataErrorInfo для обработки ошибок проверки. Gridcell становится текстовым блоком при наличии ошибок проверки.

enter image description here

Код: 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. Невозможно что-либо редактировать.

...