Привязка WPF к классу и отображение ошибок проверки - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь настроить привязку на странице WPF. Я ссылаюсь на эту статью: https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-create-a-binding-in-code

Я создаю свои элементы управления динамически, поэтому мне нужно установить все мои привязки и проверки программно. Я хочу вызвать событие PropertyChanged и вызвать классы, которые будут выполнять проверку различных свойств формы. Если проверка не удалась, я хочу отобразить ошибки в моей форме, используя шаблон проверки на моей странице дизайнера. Что я делаю не так?

Мой класс пользователя:

public class User : INotifyPropertyChanged
{
    private string _userName;

    public string UserName
    {
        get { return _userName; }
        //set
        //{
        //    _firstName = value;
        //    if (String.IsNullOrEmpty(value))
        //    {
        //        throw new Exception("Customer name is mandatory.");
        //    }
        //}
        set
        {
            _firstName = value;
            OnPropertyChanged("UserName");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string info)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }
}

Мой код, который динамически создает элементы управления:

 UserName= new TextPanel(); //TextStackPanel is a user control
 //make a new source
            ViewModelUser bindingObject = new ViewModelUser();
            //Binding myBinding = new Binding("MyDataProperty");
            Binding myBinding = new Binding("UserName");
            myBinding.Source = bindingObject;
            BindingOperations.SetBinding(UserName, TextBox.TextProperty, myBinding);
            bindingObject.PropertyChanged += OnPropertyChangedMine;

На моей странице дизайнера xaml есть следующее:

<Page.Resources>

    <ControlTemplate x:Key="ValidationTemplate">
        <DockPanel>
            <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>

    <Style x:Key="TextBoxInError" TargetType="{x:Type 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>
</Page.Resources>

1 Ответ

0 голосов
/ 08 апреля 2019

Если вы проверяете, выбрасывая исключения, вы должны установить для свойства ValidatesOnExceptions Binding значение true.

Также необходимо установить свойство Style элемента управления TextBoxна ваш Style, и вы также можете установить UpdateSourceTrigger на PropertyChanged, чтобы установщик вызывался для каждого нажатия клавиши:

TextBox textBox = new TextBox() { Style = FindResource("TextBoxInError") as Style };
User bindingObject = new User();
Binding myBinding = new Binding("UserName") { ValidatesOnExceptions = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };
myBinding.Source = bindingObject;
BindingOperations.SetBinding(textBox, TextBox.TextProperty, myBinding);

Обратите внимание, что вы не можете применить Style с TargetType от TextBox до UserControl.

...