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, поэтому там тоже может быть проблема, но я не уверен в этом...

Другие вопросы по тегам