2016-02-05 80 views
1

我有我的Model类实现INotifyPropertyChanged。 我的查看有5 TextBox,2 ButtonListView来显示网格。 在我的ViewModel中,我之前在我的Model类的ObservableCollection中添加了默认值,并将其显示为ListView使用MVVM将数据保存到集合和显示WPF

该按钮的实现使用ICommandRelayCommand完成。

现在我想从UI TextBox的用户添加数据到ObservableCollection。我怎样才能做到这一点? UI TextBox具有Model类的属性。

View

<ListView Name="UserGrid" Grid.Row="1" Margin="4,178,12,13" ItemsSource="{Binding UserDatas}" > 
<TextBox Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="80,7,0,0" Name="txtUserId" VerticalAlignment="Top" Width="178" Text="{Binding UserId}" /> 
<TextBox Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="80,35,0,0" Name="txtFirstName" VerticalAlignment="Top" Width="178" Text="{Binding FirstName}" /> 

像这些有5个文本框

Model类:

public class User : INotifyPropertyChanged 
{ 
    private int userId; 
    private string firstName; 


public int UserId 
    { 
     get 
     { 
      return userId; 
     } 
     set 
     { 
      userId = value; 
      RaisePropertyChanged("UserId"); 
     } 
    } 
} 

视图模型:

public class UsersViewModel:INotifyPropertyChanged 
{ 
    private ObservableCollection<User> userDatas; 

    public ObservableCollection<User> UserDatas 
    { 
     get 
     { 
      if (userDatas == null) 
      { 
       userDatas = new ObservableCollection<User>(); 
      } 
      return userDatas; 
     } 
     set 
     { 
      userDatas = value; 
      RaisePropertyChanged("UserDatas"); 
     } 
    } 

}

private CommandBase _LoadCommand; 
    public ICommand LoadCommand 
    { 
     get 
     { 
      if (this._LoadCommand == null) 
       this._LoadCommand = new CommandBase(LoadData); 
      return this._LoadCommand; 
     } 
    } 

    private void LoadData(object obj) 
    { 
     //What need to be done here to access the textboxes of UI which are binded to User.cs class. 

     User newUser = new User(); 
     UserDatas.Add(newUser); 
    } 

现在我需要在LoadData方法写入从UI采取inputfrom文本框,并将其存储在我的ObservableCollection

+0

使用Inotifypropertychanged。现在为文本框创建一个getter setter字符串并绑定它。现在一旦你输入了价值,就把它添加到你可观察的集合中,它应该反映出来。 – Jerin

+0

您不应该将模型绑定到UI,因为UI应该与模型无关,只知道视图模型 – Tseng

+0

到目前为止您有什么?你能基本证明你是如何将你的属性绑定到视图/视图模型上的吗? – Tyress

回答

0

有几件事情可以做。最明显的是,有一个“添加新的”命令,它会创建一个新的空对象并将其存储在CurrentUserSelectedUser属性中。

此属性绑定到模板的(或表单的)上下文。您将有3个命令(添加新用户,保存用户,取消以取消添加新用户创建)。

例如

public class UsersViewModel : INotifyPropertyChanged 
{ 
    public UsersViewModel() 
    { 
     UserDatas = new ObservableCollection<User>(); 

     AddNewUserCommand = new RelayCommand(AddNewUser, param => !this.IsNewUser); 
     SaveUserCommand = new RelayCommand(SaveUser); 
     CancelNewUserCommand = new RelayCommand(CancelNewUser, param => this.IsNewUser); 
    } 

    private ObservableCollection<User> userDatas; 
    public ObservableCollection<User> UserDatas 
    { 
     get { return userDatas; } 
     set 
     { 
      userDatas = value; 
      RaisePropertyChanged("UserDatas"); 
     } 
    } 

    private User selectedUser; 
    public User SelectedUser 
    { 
     get { return selectedUser; } 
     set 
     { 
      selectedUser = value; 
      RaisePropertyChanged("SelectedUser"); 
      RaisePropertyChanged("IsNewUser"); 
     } 
    } 

    public bool IsNewUser 
    { 
     get 
     { 
      if(SelectedUser==null) 
       return false; 

      return SelectedUser.UserId == 0; 
     } 
    } 

    public ICommand AddNewUserCommand { get; private set; } 
    public ICommand CancelNewUserCommand { get; private set; } 
    public ICommand SaveUserCommand { get; private set; } 

    private void AddNewUser() 
    { 
     SelectedUser = new User(); 
    } 

    private void SaveUser() 
    { 
     // Just in case of concurency 
     var newUser = SelectedUser; 
     if(newUser == null) 
     { 
      return; 
     } 

     var isNewUser = newUser.UserId == 0; 

     // Persist it to the database 
     this.userRepository.Add(newUser); 
     this.userRepository.SaveChanges(); 

     // If all worked well, add it to the observable collection 
     if(isNewUser) 
     { 
      // Only add if new, otherwise it should be already in the collection 
      UserDatas.Add(newUser) 
     } 
    } 
} 

但同样,这是非常气馁直接在模型上工作,并将其绑定到视图。您还应该为您的用户创建一个ViewModel,并在其中执行验证(在UserViewModel上执行IDataErrorInfo接口)并处理状态,例如跟踪UserViewModel是否脏(即数据已更改)。

所有这些都是演示问题,而不是业务逻辑,所以它们属于ViewModel而不属于Model本身。