none
Не работает валидация данных в DataGrid через IDataErrorInfo RRS feed

  • Вопрос

  • Я пытался реализовать проверку данных в моем датигриде, нашел пост товарища Colin Eberhard на codeproject и сделал по образу и подобию. Но, никаких признаков валидации не наблюдается при запуске приложения. Может отчасти дело в том, что Колин писал пример под старую версию WPFToolkit, может там что-то поменялось серьезно с тех пор... Подскажите, что не так в коде? Вот код:

    Класс моих данных. Это patial класс (сгенерированный ADO.NET Data Services 1.5 для клиентской стороны, но не суть важно). Вот как выглядит та часть, где сделана валидация. Другая часть, что сгенерена автоматом, нетронута:

    public partial class Manager : IDataErrorInfo
        {
            #region IDataErrorInfo Members
            string IDataErrorInfo.Error
            {
                get
                {
                    return CheckErrors();
                }
            }
    
            string IDataErrorInfo.this[string columnName]
            {
                get
                {
                    return CheckErrors(columnName);
                }
            }
            #endregion
            private string CheckErrors()
            {
                StringBuilder tmpErr = new StringBuilder();
                tmpErr.Append(CheckErrors("Name"));
                tmpErr.Append(CheckErrors("Rate"));
                return tmpErr.ToString();
            }
            private string CheckErrors(string columnName)
            {
                StringBuilder tmpErr = new StringBuilder();
                switch (columnName)
                {
                    case "Name":
                        if (string.IsNullOrEmpty(_Name))
                        {
                            tmpErr.AppendLine("Name can not be empty.");
                            break;
                        }
                        if (string.CompareOrdinal(_Name.Substring(0, 1), _Name.Substring(0, 1).ToUpper()) != 0)
                            tmpErr.AppendLine("Name should start from a capital letter.");
                        break;
                    case "Rate":
                        if (!string.IsNullOrEmpty(_Rate))
                            try
                            {
                                double convrate = Convert.ToDouble(_Rate);
                            }
                            catch
                            {
                                tmpErr.AppendLine("Rate is incorrect");
                            }
                        else break;                    
                        break;
                    default:
                        break;
                }
                return tmpErr.ToString();
            }
        }
    

    А вот класс, который аггрегирует обшибки всех полей в одну строку:

    public class RowDataInfoValidationRule : ValidationRule
        {
            public override ValidationResult Validate(object value,
                            CultureInfo cultureInfo)
            {
                BindingGroup group = (BindingGroup)value;
    
                StringBuilder error = null;
                foreach (var item in group.Items)
                {
                    // aggregate errors
                    IDataErrorInfo info = item as IDataErrorInfo;
                    if (info != null)
                    {
                        if (!string.IsNullOrEmpty(info.Error))
                        {
                            if (error == null)
                                error = new StringBuilder();
                            error.Append((error.Length != 0 ? ", " : "") + info.Error);
                        }
                    }
                }
    
                if (error != null)
                    return new ValidationResult(false, error.ToString());
    
                return ValidationResult.ValidResult;
            }
        }
    

    Ну и, наконец, окошко с гридом. На самом деле там гораздо больше контролов, но наверно нет смысла их показывать, ибо на работу грида они никоим образом не влияют:

    <Window x:Class="Client.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    		xmlns:obj="clr-namespace:Client">
    <Window.Resources>
    		<Style x:Key="RowStyle" TargetType="{x:Type toolkit:DataGridRow}">
    			<Style.Triggers>
    				<Trigger Property="Validation.HasError" Value="true">
    					<Setter Property="BorderThickness" Value="1"/>
    					<Setter Property="BorderBrush" Value="Red"/>
    					<Setter Property="ToolTip" Value="{Binding RelativeSource=RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
    				</Trigger>
    			</Style.Triggers>
    		</Style>
    	</Window.Resources>
    <Grid>
    <toolkit:DataGrid AutoGenerateColumns="False"	IsSynchronizedWithCurrentItem="True"
    		ItemsSource="{Binding Path=Managers, ValidatesOnExceptions=True}"
    		Name="ManagersBox"
    		CanUserDeleteRows="False"
    		IsReadOnly="True"
    		SelectionMode="Single" RowStyle="{StaticResource RowStyle}" >
    			<toolkit:DataGrid.RowValidationRules>
    				<obj:RowDataInfoValidationRule ValidationStep="UpdatedValue" />
    			</toolkit:DataGrid.RowValidationRules>
    			<toolkit:DataGrid.Columns>
    				<toolkit:DataGridTextColumn Header="ID" Binding="{Binding Path=ManagerID}" />
    				<toolkit:DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
    				<toolkit:DataGridTextColumn Header="Rate" Binding="{Binding Path=Rate}" />
    			</toolkit:DataGrid.Columns>
    						
    </toolkit:DataGrid>
    </Grid></Window>
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 21:52 MSDN Forums consolidation (От:Разработка Windows-приложений)
    7 апреля 2010 г. 21:38