Поиск…


DisplayNameAttribute (атрибут отображения)

DisplayName устанавливает отображаемое имя для свойства, события или общедоступного метода void с нулевыми (0) аргументами.

public class Employee
{
    [DisplayName(@"Employee first name")]
    public string FirstName { get; set; }
}

Простой пример использования в приложении XAML

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication="clr-namespace:WpfApplication"
        Height="100" Width="360" Title="Display name example">

    <Window.Resources>
        <wpfApplication:DisplayNameConverter x:Key="DisplayNameConverter"/>
    </Window.Resources>

    <StackPanel Margin="5">
        <!-- Label (DisplayName attribute) -->
        <Label Content="{Binding Employee, Converter={StaticResource DisplayNameConverter}, ConverterParameter=FirstName}" />
        <!-- TextBox (FirstName property value) -->
        <TextBox Text="{Binding Employee.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>
    
</Window>

namespace WpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Employee _employee = new Employee();

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public Employee Employee
        {
            get { return _employee; }
            set { _employee = value; }
        }
    }
}

namespace WpfApplication
{
    public class DisplayNameConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // Get display name for given instance type and property name
            var attribute = value.GetType()
                .GetProperty(parameter.ToString())
                .GetCustomAttributes(false)
                .OfType<DisplayNameAttribute>()
                .FirstOrDefault();

            return attribute != null ? attribute.DisplayName : string.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

введите описание изображения здесь

EditableAttribute (атрибут моделирования данных)

EditableAttribute устанавливает, должны ли пользователи изменять значение свойства класса.

public class Employee
{
    [Editable(false)]
    public string FirstName { get; set; }
}

Простой пример использования в приложении XAML

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication="clr-namespace:WpfApplication"
        Height="70" Width="360" Title="Display name example">

    <Window.Resources>
        <wpfApplication:EditableConverter x:Key="EditableConverter"/>
    </Window.Resources>

    <StackPanel Margin="5">
        <!-- TextBox Text (FirstName property value) -->
        <!-- TextBox IsEnabled (Editable attribute) -->
        <TextBox Text="{Binding Employee.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                 IsEnabled="{Binding Employee, Converter={StaticResource EditableConverter}, ConverterParameter=FirstName}"/>
    </StackPanel>
    
</Window>

namespace WpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Employee _employee = new Employee() { FirstName = "This is not editable"};

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public Employee Employee
        {
            get { return _employee; }
            set { _employee = value; }
        }
    }
}

namespace WpfApplication
{
    public class EditableConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // return editable attribute's value for given instance property,
            // defaults to true if not found
            var attribute = value.GetType()
                .GetProperty(parameter.ToString())
                .GetCustomAttributes(false)
                .OfType<EditableAttribute>()
                .FirstOrDefault();

            return attribute != null ? attribute.AllowEdit : true;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

редактируемые

Атрибуты проверки

Атрибуты проверки используются для принудительного применения различных правил проверки в декларативном виде для классов или членов класса. Все атрибуты проверки основаны на базовом классе ValidationAttribute .


Пример: RequiredAttribute

При проверке с помощью метода ValidationAttribute.Validate этот атрибут возвращает ошибку, если свойство Name равно null или содержит только пробелы.

public class ContactModel
{
    [Required(ErrorMessage = "Please provide a name.")]
    public string Name { get; set; }
}

Пример: StringLengthAttribute

StringLengthAttribute проверяет, StringLengthAttribute ли строка, чем максимальная длина строки. Он может дополнительно указать минимальную длину. Оба значения включены.

public class ContactModel
{
    [StringLength(20, MinimumLength = 5, ErrorMessage = "A name must be between five and twenty characters.")]
    public string Name { get; set; }
}

Пример: RangeAttribute

RangeAttribute дает максимальное и минимальное значение для числового поля.

public class Model
{
    [Range(0.01, 100.00,ErrorMessage = "Price must be between 0.01 and 100.00")]
    public decimal Price { get; set; }
}

Пример: CustomValidationAttribute

Класс CustomValidationAttribute позволяет использовать специальный static метод для проверки. Пользовательский метод должен быть static ValidationResult [MethodName] (object input) .

public class Model
{
    [CustomValidation(typeof(MyCustomValidation), "IsNotAnApple")]
    public string FavoriteFruit { get; set; }
}

Объявление метода:

public static class MyCustomValidation
{
    public static ValidationResult IsNotAnApple(object input)
    {
        var result = ValidationResult.Success;

        if (input?.ToString()?.ToUpperInvariant() == "APPLE")
        {
            result = new ValidationResult("Apples are not allowed.");
        }

        return result;
    }
}

Создание настраиваемого атрибута проверки

Пользовательские атрибуты проверки могут быть созданы путем получения базового класса ValidationAttribute и последующего переопределения virtual методов по мере необходимости.

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class NotABananaAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var inputValue = value as string;
        var isValid = true;

        if (!string.IsNullOrEmpty(inputValue))
        {
            isValid = inputValue.ToUpperInvariant() != "BANANA";
        }

        return isValid;
    }
}

Затем этот атрибут можно использовать следующим образом:

public class Model
{
    [NotABanana(ErrorMessage = "Bananas are not allowed.")]
    public string FavoriteFruit { get; set; }
}

Основы аннотаций данных

Аннотации данных - это способ добавления дополнительной контекстной информации к классам или членам класса. Существуют три основные категории аннотаций:

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

использование

Вот пример, в котором используются два параметра ValidationAttribute и один DisplayAttribute :

class Kid
{
    [Range(0, 18)] // The age cannot be over 18 and cannot be negative
    public int Age { get; set; }
    [StringLength(MaximumLength = 50, MinimumLength = 3)] // The name cannot be under 3 chars or more than 50 chars
    public string Name { get; set; }
    [DataType(DataType.Date)] // The birthday will be displayed as a date only (without the time)
    public DateTime Birthday { get; set; }
}

Аннотации данных в основном используются в таких рамках, как ASP.NET. Например, в ASP.NET MVC , когда модель получена методом контроллера, ModelState.IsValid() может использоваться, чтобы определить, соответствует ли полученная модель всему ее ValidationAttribute . DisplayAttribute также используется в ASP.NET MVC для определения способа отображения значений на веб-странице.

Вручную выполнять атрибуты проверки

В большинстве случаев атрибуты проверки используются внутри фреймворков (например, ASP.NET). Эти рамки заботятся о выполнении атрибутов проверки. Но что, если вы хотите вручную выполнить атрибуты проверки? Просто используйте класс Validator (не требуется никакого отражения).

Контекст проверки

Любая проверка требует контекста, чтобы дать некоторую информацию о том, что проверяется. Это может включать в себя различную информацию, такую ​​как проверяемый объект, некоторые свойства, имя для отображения в сообщении об ошибке и т. Д.

ValidationContext vc = new ValidationContext(objectToValidate); // The simplest form of validation context. It contains only a reference to the object being validated.

После создания контекста существует несколько способов проверки.

Проверка объекта и всех его свойств

ICollection<ValidationResult> results = new List<ValidationResult>(); // Will contain the results of the validation
bool isValid = Validator.TryValidateObject(objectToValidate, vc, results, true); // Validates the object and its properties using the previously created context.
// The variable isValid will be true if everything is valid
// The results variable contains the results of the validation

Проверка свойства объекта

ICollection<ValidationResult> results = new List<ValidationResult>(); // Will contain the results of the validation
bool isValid = Validator.TryValidatePropery(objectToValidate.PropertyToValidate, vc, results, true); // Validates the property using the previously created context.
// The variable isValid will be true if everything is valid
// The results variable contains the results of the validation

И больше

Подробнее о ручной проверке см. В:



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow