Microsoft-ui-xaml: INotifyDataErrorInfo рдХреЗ рд╕рд╛рде UWP рдореЗрдВ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЬрдире░ 2019  ┬╖  50рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/microsoft-ui-xaml

рдкреНрд░рд╕реНрддрд╛рд╡: INotifyDataErrorInfo рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

рд╕рд╛рд░рд╛рдВрд╢

INotifyDataErrorInfo рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ x: рдмрд╛рдЗрдВрдб рдФрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рджреЛрдиреЛрдВ рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдПрдХ рдирдИ ValidatesOnNotifyDataErrors рдкреНрд░реЙрдкрд░реНрдЯреА рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП - рдЬреИрд╕реЗ рдХрд┐ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рддреНрдпред

рджрд▓реАрд▓

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдХреЗ рдкрд╛рд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХреЛрдИ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╕рд╛рдп рдРрдк рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рдРрдк рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред uservoice рдкрд░ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ рдЬреЛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ WinUI рдХреЗ рд╕рд╛рде рдЖрдПрдЧреА, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ: https://wpdev.uservoice.com/forums/110705-universal-windows-platform/suggestions/13052589-uwp-input -рд╕рддреНрдпрд╛рдкрди

feature proposal needs-winui-3 team-Markup

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

INDEI рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рдЙрдк рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ ValidationAttributes рдФрд░ INotifyDataErrorInfo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬреЛ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╣реИрдВ, рдмрд╕ рдЗрд╕рд▓рд┐рдП рд╣рдо (рдЙрдореНрдореАрдж рд╣реИ) рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред

FWIW, рд╣рдо рдЗрд╕ ValidationBase рд╡рд░реНрдЧ рдХреЛ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд▓рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

public class ValidationBase : INotifyPropertyChanged, INotifyDataErrorInfo
{
   public event PropertyChangedEventHandler PropertyChanged;
   public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

   protected void SetValue<T>(ref T currentValue, T newValue, [CallerMemberName] string propertyName = "")
   {
       if (!EqualityComparer<T>.Default.Equals(currentValue, newValue))
       {
           currentValue = newValue;
           OnPropertyChanged(propertyName, newValue);
       }
   }

   readonly Dictionary<string, List<ValidationResult>> _errors = new Dictionary<string, List<ValidationResult>>();
   public bool HasErrors
   {
       get
       {
           return _errors.Any();
       }
   }
   public IEnumerable GetErrors(string propertyName)
   {
       return _errors[propertyName];
   }

   private void OnPropertyChanged(string propertyName, object value)
   {
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
       Validate(propertyName, value);
   }

   private void AddErrors(string propertyName, IEnumerable<ValidationResult> results)
   {
       if (!_errors.TryGetValue(propertyName, out List<ValidationResult> errors))
       {
           errors = new List<ValidationResult>();
           _errors.Add(propertyName, errors);
       }

       errors.AddRange(results);
       ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
   }

   private void ClearErrors(string propertyName)
   {
       if (_errors.TryGetValue(propertyName, out List<ValidationResult> errors))
       {
           errors.Clear();
           ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
       }
   }

   public void Validate(string memberName, object value)
   {
       ClearErrors(memberName);
       List<ValidationResult> results = new List<ValidationResult>();
       bool result = Validator.TryValidateProperty(
            value,
            new ValidationContext(this, null, null)
            {
                MemberName = memberName
            },
            results
            );

        if (!result)
        {
            AddErrors(memberName, results);
        }
    }
}

рдЖрдкрдХрд╛ рдореЙрдбрд▓ рддрдм рдЙрд╕ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

public class Person : ValidationBase
{
    private string name;
    [MinLength(4)]
    [MaxLength(6)]
    public string Name
    {   
        get { return name; }
        set { SetValue(ref name, value); }
    }
}

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ Person рд╡рд░реНрдЧ рдЖрдкрдХреЗ ViewModel рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЖрдкрдХреЗ Page рдкрд░ рд╕реЗрдЯ рд╣реИ, рдлрд┐рд░ рдЖрдк рдЙрд╕рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ:

<TextBox Text="{x:Bind ViewModel.Name, Mode=TwoWay}" />

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдЬ рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрд╛ рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдо рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

рд╕рднреА 50 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@LucasHaines рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛ рд░рд╣реЗ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?

@jevansaks рдпрд╣ рд╕реАрдзреЗ рдЙрд╕ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдорд╣рд╛рдиред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕рд╛рдордЧреНрд░реА рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИред

image

рдмрд┐рд▓реНрдб 2018 рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рддрд░рд╣ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

`
x: рдирд╛рдо = "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо" рд╢реАрд░реНрд╖рд▓реЗрдЦ = "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо:"
рдЯреЗрдХреНрд╕реНрдЯ = "{x: рдмрд╛рдЗрдВрдб рд╡реНрдпреВрдореЙрдбрд▓.рдкрд░реНрд╕рди.рдпреВрдЬрд░рдиреЗрдо,
UpdateSourceTrigger=PropertyChanged,
рдореЛрдб = рдЯреВрд╡реЗ}" />

x: рдирд╛рдо = "рдкрд╛рд╕рд╡рд░реНрдб" рд╣реИрдбрд░ = "рдкрд╛рд╕рд╡рд░реНрдб:"
рдкрд╛рд╕рд╡рд░реНрдб = "{x: рдмрд╛рдЗрдВрдб рд╡реНрдпреВрдореЙрдбрд▓ред рдкрд░реНрд╕рди.рдкрд╛рд╕рд╡рд░реНрдб,
рдЕрдкрдбреЗрдЯрд╕реЛрд░реНрд╕ рдЯреНрд░рд┐рдЧрд░ = рд▓реЙрд╕реНрдЯрдлреЛрдХрд╕,
рдореЛрдб = рдЯреВрд╡реЗ}"/>
`

@thomasclaudiushuber рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХрд╛рдо рдХреЛ {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ} рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рддрдХрдиреАрдХреА рдЪреБрдиреМрддрд┐рдпрд╛рдВ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдпрд╣ рдиреАрдЪреЗ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░рд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╕рд┐рд░реНрдл рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдорд╛рд░реНрдХрдЕрдк рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдбрд╛рдЙрдирд▓реЗрд╡рд▓ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рд╕рд╛рде рд╣реА, рд╣рдо рдХреЗрд╡рд▓ INotifyDataErrorInfo рдФрд░ DataAnnotations рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рдереЗред рд╣рдо Binding.ValidationRules рдХреЗ рдЕрдиреБрд░реВрдк рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ ValidatesOnNotifyDataErrors рдХреА рдкрд░реНрдпрд╛рдкреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рд╣рдо рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ!

@ рд╕реНрдЯреАрд╡рдирдмреНрд░рд┐рдХреНрд╕

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░: рд╣рд╛рдБ, рдЖрдк рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рд╡рд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдмрд╕ рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рдареАрдХ рд╣реИ, рдФрд░ рдмрд╕ INotifyDataErrorInfo рднреА рдареАрдХ рд╣реИред

рд▓рдВрдмрд╛:

рдмрд╕ рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб? рдореИрдВ

рд╕рднреА рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл-рдПрд▓рдУрдмреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реНрдпреВрдореЛрдбреЗрд▓ рдерд╛ рдЬреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рдХреЛрдИ рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рдареАрдХ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рднреА {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ} рд▓рд┐рдЦрд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдк рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ "рдЕрдЪреНрдЫрд╛ рд╣реЛрдирд╛" рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ} рдФрд░ рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдФрд░ {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ} рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рд╕рд╛рдорд╛рди рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ} рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдУред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ: рдмрд╛рдЗрдВрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ, рдпрд╣ рдЙрди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдФрд░ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдФрд░ рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рдкрд░ рдХрд┐рдП рдЧрдП рд╕рднреА рд╕рдореНрдореЗрд▓рди рд╡рд╛рд░реНрддрд╛ рд╕реЗ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рд╕рднреА рдПрдХреНрд╕рдПрдПрдордПрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рд╕рдмрд╕реЗ рдкрд╕рдВрджреАрджрд╛ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рд╕реЗ рдХрд╣рд╛ "рдПрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ: рдЬрд╣рд╛рдВ рднреА рдЖрдк рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реЛрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"ред :) рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕, рдкрд░рдл, рд╕реНрдЯреЗрдк-рдЗрди-рдХреЛрдб, рдФрд░ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ x рдмрдирд╛рддрд╛ рд╣реИ: рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдкрд░ рдирдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрд╛рдВрдзреЗрдВ, рдЗрд╕рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рд╕рдорд░реНрдерди рдХреЗрд╡рд▓ рдареАрдХ рд╣реИ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп рдЖрдИрдПрдордУ рд╣реИред

рдмрд╕ INotifyDataErrorInfo рдФрд░ DataAnnotations рдкреНрд░рддрд┐рдорд╛рди? рдореИрдВ

INotifyDataErrorInfo рдФрд░ DataAnnotations рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╡реИрд▓рд┐рдбреЗрдЯрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ INotifyDataErrorInfo рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╣реБрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдЬрдм рдЖрдк "рдбреЗрдЯрд╛рдЕрдиреЛрдЯреЗрд╢рди рдкреНрд░рддрд┐рдорд╛рди" рдХрд╣рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛рдЕрдиреЛрдЯреЗрд╢рди рд╕рдорд░реНрдерди рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рджреЗрд╡ рдХреЛ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? ASP.NET Core MVC рдХреА рддрд░рд╣? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдХреНрд▓рд╛рд╕реЗрд╕ ValidationContext, Validator рдФрд░ ValidationResult рдФрд░ System.ComponentModel.DataAnnotations рд╕реЗ рдЕрдиреНрдп рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реЛрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд imo рд╣реИред

рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВред рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо? рдиреВрд╣ ;-)

рдирд╣реАрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рди рдЬреЛрдбрд╝реЗрдВред INotifyDataErrorInfo рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ IDataErrorInfo рд╕рдорд░реНрдерди рдХреЛ wpf рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдХрднреА рднреА ValidationRules рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдпрджрд┐ рдореБрдЭреЗ рд╕рд╣реА рдпрд╛рдж рд╣реИ рддреЛ рдпрд╣ .NET Framework 3.5 рдореЗрдВ рдерд╛)ред рдФрд░ рдЬрдм INotifyDataErrorInfo рдХреЛ .NET Framework 4.5 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рддреЛ рдореИрдВрдиреЗ рдФрд░ рдореЗрд░реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдиреЗ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдареАрдХ рд╣реИред

ValidatesOnNotifyDataErrors рдЬреЛрдбрд╝реЗрдВ? рдирд╣реАрдВ рдкрд░рдВрддреБ...

рд╣рд╛рдВ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ Binding.ValidationRules рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЧреБрдг рд╕реАрдзреЗ INotifyDataErrorInfo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд░, ValidatesOnNotifyDataErrors рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рддреНрдп рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ {рдмрд╛рдЗрдВрдбрд┐рдВрдЧ} рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд INotifyDataErrorInfo рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЪреБрдирддрд╛ рд╣реИ рдпрджрд┐ рдмрд╛рдзреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмрд╛рдзреНрдпрдХрд╛рд░реА рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд░ ValidatesOnNotifyDataErrors рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП INotifyDataErrorInfo рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдЙрдард╛рдПрдЧрд╛ред рддреЛ, рд╢рд╛рдпрдж рдЗрд╕реЗ рдПрдХреНрд╕: рдмрд╛рдЗрдВрдб рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ, рдирд╣реАрдВ, рдРрд╕рд╛ рдордд рдХрд░реЛред рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдЕрддреАрдд рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:

рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдирд┐рдпрдВрддреНрд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд▓рд╛рд▓ рд╕реАрдорд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯред рдЕрдм рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ INotifyDataErrorInfo рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╣реИ рдЬрд┐рд╕рдореЗрдВ FirstName рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ FirstName рдЧреБрдг рд░рд┐рдХреНрдд рдпрд╛ рд░рд┐рдХреНрдд рд╣реИ, рддреЛ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЕрдм рдЖрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЛ рдЙрд╕ рдлрд░реНрд╕реНрдЯрдирд╛рдо рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░ рдмрд╛рдзреНрдп рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рдкреНрд░рдердо рдирд╛рдо рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд▓рд╛рд▓ рдмреЙрд░реНрдбрд░ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред рдмрдврд╝рд┐рдпрд╛, рдареАрдХ рд╡рд╣реА рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпреВрдЖрдИ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛ рдЬреЛ рдлрд░реНрд╕реНрдЯрдирд╛рдо рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рднреА рдЬреБрдбрд╝рд╛ рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреИрдм-рд╣реЗрдбрд░ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХред рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рднреА рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдЙрд╕ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдкрд░ рдПрдХ рд▓рд╛рд▓ рд╕реАрдорд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рдкрд░ рддреНрд░реБрдЯрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓рд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреИрдм рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдореЗрдВ рдирд╣реАрдВред рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдкрд░ рд▓рд╛рд▓ рд╕реАрдорд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдХреЗ рддреНрд░реБрдЯрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ-рдлрд░реНрд╕реНрдЯрдирд╛рдо-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░ INotifyDataErrorInfo рд╕рддреНрдпрд╛рдкрди рдХреЛ ValidatesOnNotifyDataErrors рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдмрджрд▓ рджреЗрдВред рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИред :)

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпреЗ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╕рд╛рд░рд╛рдВрд╢

рд╣рд╛рдВ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ, рдХреЗрд╡рд▓ x рдкрд░ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рд╣реЛрдирд╛: INotifyDataErrorInfo рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдВрдб рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫреА рдпреЛрдЬрдирд╛ рд╣реИред

рдирд╣реАрдВ, рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдпреЛрдЬрдирд╛ рд╣реИ, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдБ!

@thomasclaudiushuber рд╡рд┐рд╕реНрддреГрдд рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЦреНрдп рдкрд░рд┐рджреГрд╢реНрдп рдЬреЛ рдЖрдк рд▓рд╛рдЗрдирдЕрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдЪрд╛рд▓рдХ рдорд╛рдирддреЗ рдереЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдордЧреНрд░ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд░рд╣рд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдкрд┐рдЫрд▓реЗ рдХрд╛рдо рдХреЗ рдХрд╛рд░рдг рдЬреЛ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреЗ рдкрд╛рд╕ рдерд╛ред рдпрд╣рд╛рдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдореБрдЦ рдЪреАрдЬреЗрдВ рдереАрдВ:

  1. рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреА рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛, рдпрд╛ рдмреЗрд╣рддрд░ рдкреИрдЯрд░реНрди рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рдереЗред

  2. рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреА рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ/рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛрд░ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рд▓реЗрддреА рд╣реИрдВ рдЬреЛ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдПрдбреЙрд░реНрдирд░ рдкрд░рдд рд╣реИ, рдЬреЛ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдореЗрдВ рдХрд┐рд╕реА рднреА UIElement рдХреЛ рд╕рддреНрдпрд╛рдкрди рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдг (рдХреБрдЫ рдЯреЗрдореНрдкрд▓реЗрдЯ рднрд╛рдЧ рдЬреЛрдбрд╝рдХрд░)ред

  3. UWP Xaml рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдШрдЯрдирд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд░реНрдЧ рдХреЛ рдорд┐рд░рд░ рдХрд░рдиреЗ рд╕реЗ Validation.Error рдИрд╡реЗрдВрдЯ рдЬреБрдбрд╝ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбреАрд▓ рдмреНрд░реЗрдХрд░ рд╣реИ, рдмрд╕ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЬреЛ рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдПрдХ рдРрд╕рд╛ рдПрдкреАрдЖрдИ рд╣реЛрдирд╛ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реЛрдЪ рд░рд╣реЗ рдереЗ рдХрд┐ рдЙрд╕ рдореЙрдбрд▓ рд╕реЗ рдЦреБрдж рдХреЛ рддрд▓рд╛рдХ рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░/рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреА рддрд░рд╣ рдХреБрдЫ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдЕрднреА рднреА рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИрдВ рдХрд┐ рдирдП рдФрд░ рд░реЛрдорд╛рдВрдЪрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рд╡рд░реНрд▓реНрдб рдореЗрдВ рдПрдкреАрдЖрдИ рдФрд░ рд╕реНрдкреЗрдХ рд░рд┐рд╡реНрдпреВ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╣рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЬрд▓реНрдж рд╣реА рдПрдкреАрдЖрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдореБрджрд╛рдп рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХреЗ рдФрд░ рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХреЗ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд░ рдХреЛрдИ рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реЛ!

@stevenbrix рдЬрдм рдЖрдк рд╕рддреНрдпрд╛рдкрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдУрдкрди рд╕реЛрд░реНрд╕ рд╕реНрдкреЗрдХ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЪрд┐рддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдирдореВрдирд╛ рдкрд░рд┐рджреГрд╢реНрдп рддрд╛рдХрд┐ рдмрд╛рддрдЪреАрдд рд╣рдордореЗрдВ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП UI рдкрдХреНрд╖ рдореЗрдВ рдереЛрдбрд╝реА рд╡реНрдпрд╛рдкрдХ рд╣реЛ рд╕рдХреЗ , рдХреЛрдбрд┐рдВрдЧ рд╕реЗ :)

@mdtauk рдмрд┐рд▓реНрдХреБрд▓ред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрддрдорд╛рди UI рдЕрднреА рднреА рд╕рдЯреАрдХ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

@LucasHaines UI рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреНрдпрд╛ рд╕рдВрд▓рдЧреНрди рд╕рддреНрдпрд╛рдкрди рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛ред wpf рд╕реЗ рддреНрд░реБрдЯрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрдкрддреНрддрд┐?

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрдкрдЪрд╛рд░рд┐рдХ рдпреБрдХреНрддрд┐/рдкреНрд░рд╕реНрддрд╛рд╡ рдХрдм рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреА рдХреЛрдИ рд╕рдордп-рд╕реАрдорд╛ рд╣реИ?
рдореИрдВ рдЗрд╕реЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЬрд▓реНрджреА рд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдореИрдВ рдЙрдкрд░реЛрдХреНрдд @mrlacey рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ... рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЬрд╣рд╛рдВ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣рд╛рдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИред

рд╣рдо рдПрдХ рдУрдкрди рд╕реНрдкреЗрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореИрдВ рд╕рднреА рдХреЛ рдмрддрд╛ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╕реНрдкреЗрдХ рд░реЗрдкреЛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдкреНрд░рд╢реНрди: IDataErrorInfo рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ? рдпрд╣ .net рдорд╛рдирдХ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рди рдХрд░рдирд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛? рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рднреА рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ?

рд╣рдордиреЗ рдУрдкрди рд╕реНрдкреЗрдХ рд░реЗрдкреЛ рдореЗрдВ рдЗрдирдкреБрдЯ рд╡реИрд▓рд┐рдбреЗрд╢рди рдХреЗ рд▓рд┐рдП рдУрдкрди рд╕реНрдкреЗрдХ рд░рд┐рд╡реНрдпреВ рд╢реБрд░реВ рдХрд┐рдпрд╛ред https://github.com/Microsoft/microsoft-ui-xaml-specs/pull/26

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рд╣рдо рдЗрд╕ рдкрд░ рдХреИрд╕реЗ рдирдЬрд╝рд░ рд░рдЦ рд░рд╣реЗ рд╣реИрдВ - рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдИрдЯреАрдП рд╣реИ?

@knightmeister рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдУрдкрди рд╕реНрдкреЗрдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред рд╣рдо рдЗрд╕реЗ WinUI 3.0 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд┐рдк рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк WinUI 3.0 рд░реЛрдбрдореИрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╕рдорд╕реНрдпрд╛ #717 рджреЗрдЦреЗрдВред

рд╣реЗ рд╕рдм рд▓реЛрдЧ - рдХреГрдкрдпрд╛ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдирд╡реАрдирддрдо рдирдореВрдиреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред @stevenbrix рдиреЗ рдирдореВрдиреЛрдВ рдореЗрдВ рдХреБрдЫ рдмреЗрд╣рддрд░реАрди рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдФрд░ рдЕрдиреНрдп рдлреАрдбрдмреИрдХ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ред

рдПрдХ рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рд╕рддреНрдпрд╛рдкрди рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдпрдВрддреНрд░рдг рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛрдЧреА? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдирд┐рдпрдВрддреНрд░рдг (рдЬреИрд╕реЗ TabView рдпрд╛ Pivot) рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╛рд▓ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ?

рдПрдХрд╛рдзрд┐рдХ рдХрдВрдЯреЗрдирд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдЯрд┐рд▓ рджреГрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдЬрд╣рд╛рдВ рдЖрдк рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рджреГрд╢реНрдп рдХреЗ рдХрд┐рди рд╣рд┐рд╕реНрд╕реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдХреЛрдИ рдЪрд╛рдЗрд▓реНрдб рдХрдВрдЯреНрд░реЛрд▓ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рддреЛ рдкрд┐рд╡рдЯ рд╣реЗрдбрд░ рдХреА рд╢реИрд▓реА рдХреЛ рдмрджрд▓рдХрд░ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЧрдВрднреАрд░ рдореБрджреНрджрд╛ рд╣реИред
рдореЗрд░реА рдкреВрд░реА рдПрдХреНрд╕рдПрдПрдордПрд▓ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдореЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдпрд╣ рдлрд╝реАрд▓реНрдб рдФрд░ рдЗрдХрд╛рдИ рдореЙрдбрд▓ рдХреЛ BindingExpression рд╕реЗ рдкрдврд╝рддреА рд╣реИ рдФрд░ рдбреАрдП рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рдмрдирд╛рддреА рд╣реИ ( рдЗрд╕реЗ рджреЗрдЦреЗрдВ)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдирд┐рдпрдВрддреНрд░рдг (рдЬреИрд╕реЗ TabView рдпрд╛ Pivot) рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╛рд▓ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ?

@tbolon рд╣рд╛рдБ, рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрди рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд╕рдорд░реНрдерди рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдордиреЗ рдПрдХ Form рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡рдд: рдЗрд╕ рд╕рдордп рдмреИрдХрд▓реЙрдЧ рдкрд░ рд╣реИред рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреА рддрд░рд╣, рдПрдХ ValidationError (рд╡рд╣ рдирд╛рдо рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдШрдЯрдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдг рдЕрдорд╛рдиреНрдп/рд╡реИрдз рд╣реЛрдиреЗ рдкрд░ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдШрдЯрдирд╛ рдПрдХ рд░реВрдЯреЗрдб рдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рд╣реЛрдЧреА рдЬрд┐рд╕реЗ рдЖрдк рд╕реБрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореЗрд░реА рдкреВрд░реА рдПрдХреНрд╕рдПрдПрдордПрд▓ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдореЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ,

@weitzhandler рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ WinUI рдореЗрдВ ValidationRule рдЬреИрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ ValidationAttributes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЖрдкрдХреЗ рдореЙрдбрд▓ рдХреЛ INotifyDataErrorInfo рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ? рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдореЙрдбрд▓ рдФрд░ рдПрдХреНрд╕рдПрдПрдордПрд▓ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

INDEI рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рдЙрдк рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

INDEI рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рдЙрдк рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ ValidationAttributes рдФрд░ INotifyDataErrorInfo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬреЛ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╣реИрдВ, рдмрд╕ рдЗрд╕рд▓рд┐рдП рд╣рдо (рдЙрдореНрдореАрдж рд╣реИ) рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред

FWIW, рд╣рдо рдЗрд╕ ValidationBase рд╡рд░реНрдЧ рдХреЛ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд▓рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

public class ValidationBase : INotifyPropertyChanged, INotifyDataErrorInfo
{
   public event PropertyChangedEventHandler PropertyChanged;
   public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

   protected void SetValue<T>(ref T currentValue, T newValue, [CallerMemberName] string propertyName = "")
   {
       if (!EqualityComparer<T>.Default.Equals(currentValue, newValue))
       {
           currentValue = newValue;
           OnPropertyChanged(propertyName, newValue);
       }
   }

   readonly Dictionary<string, List<ValidationResult>> _errors = new Dictionary<string, List<ValidationResult>>();
   public bool HasErrors
   {
       get
       {
           return _errors.Any();
       }
   }
   public IEnumerable GetErrors(string propertyName)
   {
       return _errors[propertyName];
   }

   private void OnPropertyChanged(string propertyName, object value)
   {
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
       Validate(propertyName, value);
   }

   private void AddErrors(string propertyName, IEnumerable<ValidationResult> results)
   {
       if (!_errors.TryGetValue(propertyName, out List<ValidationResult> errors))
       {
           errors = new List<ValidationResult>();
           _errors.Add(propertyName, errors);
       }

       errors.AddRange(results);
       ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
   }

   private void ClearErrors(string propertyName)
   {
       if (_errors.TryGetValue(propertyName, out List<ValidationResult> errors))
       {
           errors.Clear();
           ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
       }
   }

   public void Validate(string memberName, object value)
   {
       ClearErrors(memberName);
       List<ValidationResult> results = new List<ValidationResult>();
       bool result = Validator.TryValidateProperty(
            value,
            new ValidationContext(this, null, null)
            {
                MemberName = memberName
            },
            results
            );

        if (!result)
        {
            AddErrors(memberName, results);
        }
    }
}

рдЖрдкрдХрд╛ рдореЙрдбрд▓ рддрдм рдЙрд╕ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

public class Person : ValidationBase
{
    private string name;
    [MinLength(4)]
    [MaxLength(6)]
    public string Name
    {   
        get { return name; }
        set { SetValue(ref name, value); }
    }
}

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ Person рд╡рд░реНрдЧ рдЖрдкрдХреЗ ViewModel рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЖрдкрдХреЗ Page рдкрд░ рд╕реЗрдЯ рд╣реИ, рдлрд┐рд░ рдЖрдк рдЙрд╕рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ:

<TextBox Text="{x:Bind ViewModel.Name, Mode=TwoWay}" />

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдЬ рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрд╛ рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдо рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╕рдВрд╕реНрдерд╛рдПрдВ рдЧреИрд░ POCO рд╣реЛрдВред
рдореБрдЭреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрд▓рдУрдмреА рдРрдк рдореЗрдВ EntityBase рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдмрд╕ POCO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрджрдд рд╣реИред

UWP рдХреЗ рдкрд╛рд╕ *рд╣реИрд╡ рд╡реИрд▓рд┐рдбреЗрд╢рди* рдирд╣реАрдВ рд╣реИ !!!!!!! рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд╕рдордп рддрдХ рд╡рд╛рдкрд╕ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдкрд░ред

@ rufw91 рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╣реИ рдирд╛?!

рдЖрдкрдХреЗ рд╕рдордп рдХреА рдХрдореА рдХреНрдпрд╛ рд╣реИрдВ? рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди WinUI3 рдЕрд▓реНрдлрд╛ рдореЗрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЬрд▓реНрдж рд╣реА //рдмрд┐рд▓реНрдб рдЯрд╛рдЗрдордлреНрд░реЗрдо рдореЗрдВ WinUI рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рддрдХ RTM'ing рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ

UWP рдХреЗ рдкрд╛рд╕ *рд╣реИрд╡ рд╡реИрд▓рд┐рдбреЗрд╢рди* рдирд╣реАрдВ рд╣реИ !!!!!!! рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд╕рдордп рддрдХ рд╡рд╛рдкрд╕ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдкрд░ред

рдореИрдВрдиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рд╕рдм рдХрд┐рдпрд╛ рд╣реИ (рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл, рдПрд╕рдПрд▓, рдбрдмреНрд▓реНрдпреВрдкреА, рдпреВрдбрдмреНрд▓реНрдпреВрдкреА, рдЖрджрд┐), рдЕрдВрдд рдореЗрдВ рдХреЗрд╡рд▓ 1 рддрдХрдиреАрдХ рдареЛрд╕ рд▓рдЧрддреА рд╣реИ, рдЬреЛ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдХрд┐ WinUI рдХрд╣рд╛рдБ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирдИ рддрдХрдиреАрдХ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдФрд░ рдЕрдВрдзреЗрд░реЗ рдореЗрдВ рдЕрдХреЗрд▓рд╛ рд░рд╣ рдЬрд╛рдиреЗ рд╕реЗ рдердХ рдЧрдпрд╛ рд╣реВрдБред рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдкрд░рд┐рдкрдХреНрд╡ рд╣реИ рдФрд░ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдПрдХ рдУрдПрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рди рд╣реЛ, рддреЛ рдЖрдЗрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рдФрд░ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдПрдХ рдУрдПрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рди рд╣реЛ, рддреЛ рдЖрдЗрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рдФрд░ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдордиреЗ рдЕрднреА 1 рдмрд┐рд▓рд┐рдпрди рд╡рд┐рдВрдбреЛрдЬ 10 рдЗрдВрд╕реНрдЯрд╛рд▓ рдХреЛ рдкрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рд╕рдордп рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА рднреА рд╕рдЪ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреА рдирд┐рд░рд╛рд╢рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдкрд░ рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЛрд╖ рдирд╣реАрдВ рджреЗрддрд╛ред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рд╣рдорд╛рд░реА рдЯреАрдо рдЕрдм рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓реЗ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдХреБрдЫ рдХрд░рддреЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

INDEI рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рдЙрдк рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдореЗрд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╕рднреА рдкреАрдУрд╕реАрдУ рдЗрдХрд╛рдЗрдпрд╛рдВ рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдореБрдХреНрдд рд░рд╣ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдмрд┐рдирд╛ рд░рд╣ рд╕рдХрддреА рд╣реИрдВред рдЖрдИрдПрдирдкреАрд╕реА рдХреЛ рдлреЛрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рддрдГ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ IValidatableObject рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдпрд╣ рд╕рдм-рдЯрд╛рдЗрдкреНрд╕ рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

FWIW, рд╣рдо рдЗрд╕ ValidationBase рд╡рд░реНрдЧ рдХреЛ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд▓рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ? рдЗрд╕рд▓рд┐рдП рднреА рдореИрдВ INotifyDataErrorInfo рдХрд╛ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред рдЖрдИрдПрдирдкреАрд╕реА рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдХреЗ рд▓рд┐рдП рд╕рд┐рд░рджрд░реНрдж рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдбреЗрдЯрд╛ рдРрдкреНрд╕ рд╕реЗ рдирд┐рдкрдЯрдирд╛ред

рдпрд╣ рдХрд╛рдлреА рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдЙрдЪрд┐рдд рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдРрдк рдореЗрдВ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдХрд╛рдлреА рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХрд┐ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдЙрдЪрд┐рдд рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдРрдк рдореЗрдВ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдБ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ :)

рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ?

рдореИрдВ рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдБ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ :)

рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХрд╛ рдЖрднрд╛рд░ рд╣реИред рдпрд╣, рдФрд░ рдЖрдкрдХрд╛ рдмрд╛рдХреА рдХрд╛рдоред
рд▓реЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛-рд╡рд┐рдиреБрдИ-3 рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

рдореИрдВ рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЗрдХрд╛рдЗрдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OData Connected Service рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБрдПрдБ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреА рд╣реИрдВ:

c# public abstract partial class ContactBase : Microsoft.OData.Client.BaseEntityType, INotifyPropertyChanged

рд▓реЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛-рд╡рд┐рдиреБрдИ-3 рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

@weitzhandler
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди WinUI 3 рдХреЗ рд╕рд╛рде рдЖрдПрдЧрд╛ред (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ 3.0)ред рдпрд╣ рд╢рд╛рдпрдж рд╡рд┐рдирдпреВрдЖрдИ 2 рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдУрдПрд╕ рдПрдХреНрд╕рдПрдПрдордПрд▓ рдХреЛрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЕрдм рддрдХ рд░рдЦрд░рдЦрд╛рд╡ рдореЛрдб рдореЗрдВ рд╣реИред

рдореИрдВ рдпреВрдПрдирдУ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо рдРрдк рдореЗрдВ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдкрд░ WinUI рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдереЛ!

рдореИрдВ рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реЛрдиреЗ рдкрд░ рдЕрдХреНрд╕рд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рджреНрд╡рд╛рд░рд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЬрд┐рд╕ рджреГрдврд╝рддрд╛ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпреВрдбрдмреНрд▓реНрдпреВрдкреА/рд╡рд┐рдирдпреВрдЖрдИ рднреА рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдорд╛рдВрдЧ рдХрд░рдирд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рдХреЛрдИ рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред (рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред)

рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реЛрдиреЗ рдкрд░ рдЕрдХреНрд╕рд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рджреНрд╡рд╛рд░рд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЬрд┐рд╕ рджреГрдврд╝рддрд╛ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпреВрдбрдмреНрд▓реНрдпреВрдкреА/рд╡рд┐рдирдпреВрдЖрдИ рднреА рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдорд╛рдВрдЧ рдХрд░рдирд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рдХреЛрдИ рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдмреИрдХ рдЕрдк рд▓реЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реА рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдореИрдВрдиреЗ рдХреБрдЫ рднреНрд░рдо рдкреИрджрд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдореЗрд░рд╛ рдмреБрд░рд╛ рд╣реИред

рдореЙрдбрд▓ рдХреЛ рдХреЗрд╡рд▓ System.ComponentModel.INotifyDataErrorInfo (рдпрд╛ C++ рдХреЗ рд▓рд┐рдП Windows.UI.Xaml.Data.INotifyDataErrorInfo ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред {x:Bind} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдареАрдХ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

рдЬрд┐рд╕ ValidationBase рд╡рд░реНрдЧ рдХрд╛ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд╢рд┐рдкрд┐рдВрдЧ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рдереЗ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА INotifyPropertyChanged ред рдпрджрд┐ рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рддреЛ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг @stevenbrix рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ IValidatableObject рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛, рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ UWP рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рд╕рдореНрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ, рдЬреИрд╕реЗ MaxLength рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпрд╛ TextBox рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ ASP.NET рдХреА рддрд░рд╣ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧреА?
DataTypeAttribute , EditableAttribute рдХреЗ рд╕рд╛рде рд╣реАред
рдлрд╝реАрд▓реНрдб рд╣реЗрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА DisplayAttribute ред
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рд╡реЗ рд╕рднреА рд╕рдорд░реНрдерд┐рдд рдереЗред

( рдЗрд╕реЗ рджреЗрдЦреЗрдВ)ред

рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ IValidatableObject рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛, рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ UWP рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рд╕рдореНрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Required рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛ред рдЬрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдЖрдЧреЗ рдереЛрдбрд╝рд╛ рддрд╛рд░рд╛рдВрдХрди рдбрд╛рд▓ рджреЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдФрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рд░рдВрднрд┐рдХ WinUI3 рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдорд░реНрдерди рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рдЬрд╣рд╛рдВ IValidatableObject рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдЗрдВрдЬрди рдХреЗрд╡рд▓ INotifyDataErrorInfo.ErrorsChanged рдШрдЯрдирд╛ рдХреЛ рд╕реБрдирдХрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореЙрдбрд▓ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдРрдк рдбреЗрд╡рд▓рдкрд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд▓рдХреНрд╖реНрдп рд╕реЗ рд╕реНрд░реЛрдд рддрдХ рдореВрд▓реНрдп рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд ValidationBase рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ Validator.TryValidateObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╕рддреНрдпрд╛рдкрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЗрдХрд╛рдИ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред ?
рдЗрд╕ рддрд░рд╣, рдЗрд╕реЗ рдХреЗрд╡рд▓ INotifyDataErrorInfo рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ INotifyDataErrorInfo рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рд░рдирдЯрд╛рдЗрдо рдпрд╛ рдЯреВрд▓рдХрд┐рдЯ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рддреНрдпрд╛рдкрди рдпреЛрдЧреНрдп рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рди рд╕рдХреЗ, рдФрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХреЗред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд ValidationBase рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ Validator.TryValidateObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╕рддреНрдпрд╛рдкрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЗрдХрд╛рдИ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ?

рдпрд╣ рдПрдХ рдорд╣рд╛рди рд╡рд┐рдЪрд╛рд░ рд╣реИ :)

рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рд╕реНрд░реЛрдд рдЬрдирд░реЗрдЯрд░ рдкреНрд░рддрд┐рдорд╛рди рдпрд╣рд╛рдВ рднреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдБ @ рдорд╛рдЗрдХрд▓-рд╣реЙрдХрд░, рдореБрдЭреЗ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИрдВ!

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореЗрд░реЗ рдорди рдореЗрдВ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рдереЗ рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдирдП рд╕реНрд░реЛрдд рдЬрдирд░реЗрдЯрд░ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирдП рд╕реНрд░реЛрдд рдЬрдирд░реЗрдЯрд░ рдкреНрд░рддрд┐рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо INotifyDataErrorInfo рдФрд░ INotifyPropertyChanged рдХреЗ рд▓рд┐рдП рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдмрдирд╛/рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдкрд╛рд╕ Pluralsight рдкрд░ рдПрдХ WPF рдкрд╛рдареНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ T4, INotifyPropertyChanged рдФрд░ INotifyDataErrorInfo рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: https://www.pluralsight.com/courses/wpf-mvvm-advanced-model-treatment
рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╕реНрдЯрдо рд╕рдВрд▓рдЧреНрди рдЧреБрдгреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдПрдорд╡реАрд╡реАрдПрдо рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдРрдк рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдкрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореВрд▓ рдореВрд▓реНрдп рдХреНрдпрд╛ рдерд╛ред

рддреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЪреАрдЬреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдФрд░ рд╢рд╛рдпрдж рдкреБрд╕реНрддрдХрд╛рд▓рдп (рд╢рд╛рдпрдж рдбрдмреНрд▓реНрдпреВрд╕реАрдЯреА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдореБрдЭреЗ рдЙрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ WinUI рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред :)

@ rufw91 рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╣реИ рдирд╛?!

рдЖрдкрдХреЗ рд╕рдордп рдХреА рдХрдореА рдХреНрдпрд╛ рд╣реИрдВ? рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди WinUI3 рдЕрд▓реНрдлрд╛ рдореЗрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЬрд▓реНрдж рд╣реА //рдмрд┐рд▓реНрдб рдЯрд╛рдЗрдордлреНрд░реЗрдо рдореЗрдВ WinUI рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рддрдХ RTM'ing рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ

@stevenbrix рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐, рдореБрдЭреЗ рд╡рд╛рдкрд╕ wpf рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рдмрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реВрдБред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЦреЛрд▓рд╛ред

рдЗрд╕ рдкрд░ рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреНрд╡рд┐рдЯрд░ рдкрд░ @stevenbrix рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдзрд╛рд░ INotifyDataErrorInfo рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╣рд╛рдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ рдПрдХ рдирдП ObservableValidator рд╡рд░реНрдЧ рдореЗрдВ рдирдП рдПрдорд╡реАрд╡реАрдПрдо рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ( Microsoft.Toolkit.Mvvm рдкреБрд╕реНрддрдХрд╛рд▓рдп), рдЬреЛ INotifyPropertyChanged рдФрд░ INotifyPropertyChanging рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЖрдк рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдФрд░ рдЙрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд░ рдЪреАрдЬ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдПрдорд╡реАрд╡реАрдПрдо рдЯреВрд▓рдХрд┐рдЯ рдХреЗ рдореВрд▓ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдВрдХ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рд╣реИрдВ, рд╕рд╛рде рд╣реА рдирдП рджреЗрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдкрдбреЗрдЯ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрддреНрд╕реБрдХ рдЕрдЧрд░ UWP 10.0 18362 INotifyDataErrorInfo рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд╕рд╛рд░, https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.inotifydataerrorinfo?view=netcore-3.1 INotifyDataErrorInfo UWP 10.0 рдкрд░ "рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ"ред рд╣рд╛рд▓рд╛рдБрдХрд┐, UWP 10.0 18362 рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рд▓рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ INotifyDataErrorInfo рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХреНрд╕рдПрдПрдордПрд▓ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ:

<TextBox Text="{x:Bind ViewModel.Username, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

рдФрд░ рд╣рдо рдпрд╣рд╛рдВ ReactiveValidationObject INotifyDataErrorInfo рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред

@worldbeater рдпрд╣ рдХреЗрд╡рд▓ WinUI3 рдХреЗ рдирд╡реАрдирддрдо рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж @stevenbrix! WinUI3 рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред INotifyDataErrorInfo рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдФрд░ UWP рдорд┐рддреНрд░рд╡рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдВрдд рдореЗрдВ

@worldbeater , рдпрд╣ рдЕрднреА рднреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛! рдореИрдВ

@worldbeater рд╡реИрд╕реЗ, рдбреЙрдХреНрд╕ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ UWP 10.0 рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Gavin-Williams picture Gavin-Williams  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ocalvo picture ocalvo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BrandonKuenzi picture BrandonKuenzi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MartinZikmund picture MartinZikmund  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

micahl picture micahl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ