2017-07-03 9 views
0

は簡単で十分です:MVVMでデータを操作するには?データを読むために

  1. のViewModelは
  2. のViewModelがViewはのObservableCollection

に一覧/データグリッドの/ etcをバインドするのObservableCollection

  • にデータを追加してデータベースからデータを取得します次のようになります。

    private readonly ObservableCollection<User> _users 
         = new ObservableCollection<User>(); 
    
    public IEnumerable<User> Users 
    { 
        get { return _users; } 
    } 
    
    public ICommand ListUsersCommand 
    { 
         get 
         { 
          return new DoSomething(ListUsers); 
         } 
    } 
    private void ListUsers() 
    { 
        using (OrtundDbContext db = new OrtundDbContext()) 
        { 
         var Users = db.Users.Where(x => x.Deleted == false); 
         foreach (var u in Users) 
         { 
          if (!_users.Contains(u)) 
          _users.Add(u); 
         } 
        } 
    } 
    

    これにより、バインダーgからUsersに変更してください。そうすれば、多かれ少なかれ逆のことが可能であるはずです。 Window上のコントロールの更新された値を送り返し、ViewModelで使用してデータソースを更新できること。

    <StackPanel DataContext={Binding ViewModels:UserViewModel}"> 
        <Label>Name:</Label> 
        <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
        <Button Name="btnAdd" Command="{Binding AddUserCommand}" Content="Add User" /> 
    </StackPanel> 
    
    // Base model implements INotifyPropertyChanged 
    public class UserViewModel : BaseModel 
    { 
        private string _name; 
        public string Name 
        { 
         get { return _name; } 
         set 
         { 
          _name = value; 
          RaisePropertyChangedEvent("Name"); 
         } 
        } 
    
        public ICommand AddUserCommand 
        { 
         get 
         { 
          return new DoSomething(AddUser); 
         } 
        } 
    
        public void AddUser() 
        { 
         var User = new User 
         { 
          User.Name = Name // assign values based on properties. 
         }; 
    
         using (OrtundDbContext db = new OrtundDbContext()) 
         { 
          db.Users.Add(User); 
          db.SaveChanges(); 
         } 
        } 
    } 
    

    を今の問題は、私はは、AddUserを得るとき、それはの値をと思われるということです。...残念ながら何が起こっている

    ではありません現在、私は次のようしている

    ViewModelのプロパティ(たとえば、UserViewModel.Name)はすべて空であり、フォームの値はありません。

    これは間違っていますか? UIからデータソースを更新する適切な方法は何ですか?

  • +0

    「UserViewModel.Name」はどこに定義されていますか? – Lithium

    +0

    ViewModelで。私はそこにあったコメントをプロパティの定義に置き換えました – Ortund

    +0

    名前はOnPropertyChangedを起動しませんか? – mageos

    答えて

    2

    あなたがのコマンドを呼び出すUserViewModelの実際のインスタンスにTextBoxまたはその親要素のいずれかのDataContextを設定していることを確認してください:あなたは上記のサンプルマークアップとセットを使用する場合は

    <StackPanel> 
        <StackPanel.DataContext> 
         <local:UserViewModel /> 
        </StackPanel.DataContext> 
        <Label>Name:</Label> 
        <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
        <Button Name="btnAdd" Command="{Binding AddUserCommand}" Content="Add User" /> 
    </StackPanel> 
    

    AddUser()メソッドのブレークポイントには、Nameプロパティの値がTextBoxに表示されています。

    関連する問題