WPF TextBox Binding ElementName null?
У меня есть элемент управления ListBox с TypeUsers. Когда я выбираю какую-либо запись в Listbox и обновляю Name в TextBox, свойство Name / текстовое поле всегда возвращают нуль. Никогда не принимать значение из TextBox, всегда ноль?
Это мой код
<ListBox x:Name="LstTypeUsers"
Grid.Row="0" Grid.Column="4"
Width="220" Height="120"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ItemsSource="{Binding TypeUsers}"
DisplayMemberPath="Name">
</ListBox>
<TextBox
Grid.Row="0" Grid.Column="2"
x:Name="txtName"
HorizontalAlignment="Left" Height="23"
TextWrapping="Wrap"
VerticalAlignment="Top" Width="170"
Text="{Binding ElementName=LstTypeUsers, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Validation.ErrorTemplate="{x:Null}"/>
<Button
Grid.Column="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="100" Height="30"
Command="{Binding UpdateTypeUserCmd}"
Grid.ColumnSpan="3" Margin="20,90,0,0">
<StackPanel Orientation="Horizontal">
<Image Source="/Images/Save.png" />
<TextBlock Width="55" Height="18" ><Run Text=" "/><Run Text="Update"/></TextBlock>
</StackPanel>
</Button>
РЕДАКТИРОВАТЬ
// Model class
public class UserType: INotifyPropertyChanged
{
[Key]
private int usertypeId;
public int UserTypeId
{
get
{
return this.usertypeId;
}
set
{
this.usertypeId = value;
OnPropertyChanged("UserTypeId");
}
}
[MaxLength(200)]
private string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
OnPropertyChanged("Name");
}
}
[Required]
private bool status;
public bool Status
{
get
{
return this.status;
}
set
{
this.status = value;
OnPropertyChanged("Status");
}
}
public virtual ObservableCollection<User> User { get; private set; }
public UserType()
{
this.User = new ObservableCollection<User>();
}
}
// ViewModelBase class
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
// UserTypeViewModel
public class UserTypeViewModel
private UserType _userType;
private ObservableCollection<UserType> _UserTypeList;
// Constructor
public UserTypeViewModel()
{
_userType = new UserType();
_UserTypeList = new ObservableCollection<UserType>(GetUserTypeAll());
}
public ObservableCollection<TypeUsers> TypeUsers
{
get
{
return _UserTypeList;
}
set
{
_UserTypeList = value;
//OnPropertyChanged("TypeUsers");
}
}
public string Name
{
get
{
return _userType.Name;
}
set
{
_userType.Name = value;
//OnPropertyChanged("Name");
}
}
Спасибо.
3 ответа
Воплощать в жизнь INotifyPropertyChanged
интерфейс в UserType
учебный класс.
Я решил свою проблему. Я также реализовал интерфейс INotifyPropertyChanged в классе Model. Я новичок в WPF MVVM, и я прочитал, что этот интерфейс реализован только в ViewModel для соединения с View. Теперь я реализовал в обоих классах, и все отлично работает.
Спасибо всем.
Вы привязываете непосредственно к элементу управления WPF (ListBox
), а не ViewModel. Я предлагаю вам добавить свойство в вашей ViewModel, которое будет привязано к TextBox.Text
свойство, после изменения данных или изменения пользователем значения в TextBox
, затем данные будут обновлены и будут отражены в пользовательском интерфейсе.
Кроме того, если я правильно помню, при запуске SelectedItem
собственность ListBox
имеет значение null, поэтому там тоже может быть проблема, но я не уверен в этом...