2016-04-27 8 views
2

実際の状態:ログインボタンをクリックすると、ViewModelが新しいビューに変わります。MVVM - バインドと変更

希望の状態:私はLoginButtonをクリックします(LoginViewModelはビューとバインドして電子メールとパスワードを取得し、サーバーの信頼性を検証し、OKの場合要求がユーザーの情報と変更ビュー)私が知っている何

:(サーバーとのテキストボックス、通信をバインド要求と回答)を取り扱い、ビューを変更

私が知らない何か:GeneralViewModelにLoginViewModelから送信答えは、ユーザーについての情報、バインドのTextBoxの代わりにPasswordBoxを維持する方法を知らない。

CODE: LoginView今

<Grid Margin="0,0,-74.4,-11.8" HorizontalAlignment="Left" Width="800" Height="600" VerticalAlignment="Top"> 

    <TextBox Text = "{Binding Email, Mode = TwoWay}" Style="{DynamicResource MyTextBox}" x:Name="textBoxEmail" VerticalContentAlignment="Bottom" HorizontalContentAlignment="Center" HorizontalAlignment="Center" Width="248" Margin="274,212,278,347" FontFamily="Segoe UI Semibold" /> 

    <Image Source="C:\Users\Images\logo.png" x:Name="Logo" HorizontalAlignment="Left" Height="129" Margin="301,63,0,0" VerticalAlignment="Top" Width="151" RenderTransformOrigin="0.5,0.5"> 
     <Image.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform Angle="0.091"/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Image.RenderTransform> 
    </Image> 

サインアップ! パスワードを忘れましたか?ここをクリック!

LoginViewModel

class LoginViewModel : AViewModel 
{ 
    WifiAP wa; 
    #region fields 
    private string _email = null; 
    private TokenRequest tk; 
    public DelegateCommand LoginCommand { get; set; } 

    public string Email 
    { 
     get 
     { 
      return _email; 
     } 
     set 
     { 
      _email = value; 
      OnPropertyChanged("Email"); 
      //Here's the magic 
      LoginCommand.RaiseCanExecuteChanged(); 
     } 
    } 
    private string _password = null; 

    public string Password 
    { 
     get 
     { 
      return _password; 
     } 
     set 
     { 
      _password = value; 
      OnPropertyChanged("Password"); 
      //Here's the magic 
      LoginCommand.RaiseCanExecuteChanged(); 
     } 
    } 
    public string mac; 
    #endregion 

    public LoginViewModel() 
    { 
     wa = new WifiAP(); 
     LoginCommand = new DelegateCommand(Login, CanLogin); 

    } 

    public bool CanLogin() 
    { 
     return !string.IsNullOrEmpty(Email); 
    } 

    public void Login() 
    { 
     // 
    } 


    #region auxiliaryMethods 
    public string getMac() 
    { 
     mac = wa.GetMACAddress(); 
     return mac; 
    } 

    public string hashingMD5(string pass) 
    { 
     string pwd = pass; 
     System.Security.Cryptography.MD5 hs = System.Security.Cryptography.MD5.Create(); 
     byte[] db = hs.ComputeHash(System.Text.Encoding.UTF8.GetBytes(pwd)); 
     string result = Convert.ToBase64String(db); 
     return result; 
    }} 

MainViewModel

public MainWindowViewModel{ 
this.AddViewModel(new LoginViewModel() { DisplayName = "Login", InternalName = "LoginViewModel" }); 
this.AddViewModel(new GeneralViewModel() { DisplayName = "General", InternalName = "GeneralViewModel" }); 
this.Current_ViewModel = this.GetViewModel("LoginViewModel"); 

お時間を事前に感謝します。

+0

私はあなたが少し難しいと思っています。ViewModelの基本クラスとしてBindableBaseを使用し、全体のナビゲーションにRequestNavigate(ターゲット、パラメータ)メソッドを使用するRegionManagerを使用する方が簡単です。 NuGetパッケージPrism.Coreをインストールすることで、すべてを手に入れることができます。ログイン方法の内容を教えてください。どのようにRegionManagerなしでViewsを変更しますか? – mikes

+0

あなたの時間のためにこんにちは@mikesありがとう。私はMVVM Lightをインストールし、いくつかのものを使用していますが、私はまだこの新しいアーキテクチャを勉強しています。私はいくつかの概念を理解しようとしているstackoverflowで粉砕しているが、私は多くの問題を抱えている。あなたの最初の質問に答えるために、私は電子メールとパスワードを持っています。 – Antoine

+0

LoginViewModelクラスでLoginメソッドを呼び出した後、Viewをどのように変更するのかを知りたいと思います。 – mikes

答えて

0

最初に、here you have the articleは、MVVMのPasswordBoxに対処する方法と方法を教えてくれます。第二に、データをどのように通すか?私は個人的にPRSIMを使用するので、私はMVVM Lightにあまり慣れていません。あなたは何か同じようにRegionContextを行うかもしれません。

まず、あなたのRegionDataとしてクラスを作成する必要があります。このモデルもOnPropertyChangedインタフェースを実装していることに注意してください(MVVM Lightの継承されたViewModelBaseの実装が実装されています)。コンストラクタであなたのviewmodelsの両方のために、このクラスの一般的なインスタンスを作成する必要がありますよりも

public class HaveLoginData : ViewModelBase 
{ 
    private string _login; 
    public string Login 
    { 
     get { return _login; } 
     set 
     { 
      _login = value; 
      RaisePropertyChanged(() => Login); 
     } 
    } 
} 

public MainWindowViewModel 
    { 
     var regionData = new HaveLoginData(); 
     this.AddViewModel(new LoginViewModel() { RegionData = regionData }); 
     this.AddViewModel(new GeneralViewModel() { RegionData = regionData }); 
     this.Current_ViewModel = this.GetViewModel("LoginViewModel"); 
    } 

あなたはまた、RegionData呼ばれるあなたのviewmodelsに新しいプロパティを追加する必要があります。

using System.ComponentModel; 

namespace YourApp.ViewModels 
{ 
    public class GeneralViewModel 
    { 
     private HaveLoginData _regionData; 
     public HaveLoginData RegionData 
     { 
      get { return _regionData; } 
      set 
      { 
       _regionData = value; 
       _regionData.PropertyChanged += _regionData_PropertyChanged; 
      } 
     } 

     private void _regionData_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      if (e.PropertyName == "Login") 
      { 
       // do the second view model login logic 
      } 
     } 
    } 
} 

とログインのViewModel:

namespace YourApp.ViewModels 
{ 
    public class LoginViewModel 
    { 
     public HaveLoginData RegionData { get; set; } 

     public void Login() 
     { 
      // do the login conditions logic 
      if (true) 
      { 
       RegionData.Login = "new user login"; 
      } 
     } 
    } 
} 

ご覧のとおり、誰かがRegionDataを設定すると、PropertyChangedイベントを購読し、LoginおよびMD5Passwordプロパティ内の変更についてすべてのViewModelに通知します。ご覧のとおり、以前のRegionDataのPropertyChangedイベントからの登録解除についても覚えておく必要があります。一度作成したRegionDataは変更しないでください。セッターで行う必要はありません(参照を削除するために何らかのDisposeを行うことができます)。

+0

こんにちは、私はこれを試しました。それを動作させる管理:x – Antoine

+0

OnRegionDataChangedメソッドは呼び出されませんか? LoginViewModelコードどこかで私はそれを見ることができますか? – mikes

+0

私はこの動作をしたいです。http://i.imgur.com/qwKdh1T.png – Antoine

関連する問題