#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, чтобы заставить его работать.
Удачного кодирования!