2016-02-05 77 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本身。