-1

我有一个带有 TypeUsers 的 ListBox 控件。当我在 Listbox 中选择一些记录并在 TextBox 中更新 Name 时,Name 属性/文本框总是返回 null。永远不要从 TextBox 中取值,总是 null ?

图片说明在这里

这是我的代码

<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");
  }
}

谢谢你。

4

3 回答 3

0

您直接绑定到 WPF 控件 ( ListBox) 而不是 ViewModel。我建议您在 ViewModel 中添加一个属性,该属性将绑定到该TextBox.Text属性,一旦数据更改或用户更改了 中的值TextBox,则数据将更新并反映在 UI 中。

另外,如果我没记错的话,在启动时,SelectedItem属性ListBox是空的,所以那里也可能存在问题,但我不确定......

于 2016-02-02T20:12:33.820 回答
0

我已经解决了我的问题。我还在 Model 类中实现了 INotifyPropertyChanged 接口。我是 WPF MVVM 的新手,我读到这个接口仅在 ViewModel 中实现,用于与 View 连接。现在我已经在两个类中实现了,一切都很好。

感谢大家。

于 2016-02-04T19:14:35.963 回答
0

在类中实现INotifyPropertyChanged接口。UserType

于 2016-02-02T18:13:44.803 回答