Привязанная цель не обновляется при нажатии кнопки для изменения значения

#c# #wpf #data-binding #wpf-controls

#c# #wpf #привязка к данным #wpf-элементы управления

Вопрос:

У меня есть некоторый код, который использует форму. Форма привязана к моему классу, FormData . У меня привязка работает хорошо и я обновляю свой formData (локальный экземпляр), но когда я пытаюсь изменить значение одной из переменных в formData при нажатии кнопки / триггере LostFocus, она не обновляется.

Вот мой соответствующий XAML:

 <TextBox x:Name="friendly_name_textBox" 
                     Style="{StaticResource TextErrorStyle}"
                     Text="{Binding 
                PrimaryUserName,
                Mode=TwoWay,
                ValidatesOnExceptions=True,
                ValidatesOnDataErrors=True,
                UpdateSourceTrigger=PropertyChanged,
                NotifyOnValidationError=True}"
                     HorizontalAlignment="Left" 
                     Margin="0,75,0,0" 
                     TextWrapping="Wrap" 
                     VerticalAlignment="Top" 
                     Width="120"/>`
  

Кнопка срабатывает (которая действительно запускается):

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        formData.PrimaryUserName = "TEST";
    }
  

И мой FormData код:

 public string PrimaryUserName
    {
        get
        {
            return primaryUserNameValue;
        }
        set
        {
            if(primaryUserNameValue != value)
            {
                primaryUserNameValue = value;
            }
        }
    }
  

Комментарии:

1. Вам необходимо реализовать INotifyPropertyChanged.

Ответ №1:

Вам необходимо реализовать интерфейс INotifyPropertyChanged и вызвать PropertyChanged событие в вашем formData классе:

 public class formData : INotifyPropertyChanged
{
    private string primaryUserNameValue;
    public string PrimaryUserName
    {
        get
        {
            return primaryUserNameValue;
        }
        set
        {
            if (primaryUserNameValue != value)
            {
                primaryUserNameValue = value;
                NotifyPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
  

Комментарии:

1. Спасибо! Я внедрял INotifyDataErrorInfo интерфейс и не понимал, что мне нужно INotifyPropertyChanged . Теперь это работает хорошо.

Ответ №2:

Вашему классу необходимо реализовать INotifyPropertyChanged, чтобы целевой объект знал, изменяется ли исходное свойство: https://learn.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification Это действительно просто, пожалуйста, ознакомьтесь с документацией и соответствующим образом скорректируйте свой код. Ваше свойство должно было бы выглядеть следующим образом:

 public string PrimaryUserName
{
    get
    {
        return primaryUserNameValue;
    }
    set
    {
        if(primaryUserNameValue != value)
        {
            primaryUserNameValue = value;
            OnPropertyChanged("PrimaryUserName");
        }
    }
}
  

Но вам также нужны функции event и OnPropertyChanged, чтобы заставить его работать.
Удачного кодирования!