2017-05-23 6 views
0

私は間違ってやっていることを理解しようとするのにこれに時間を費やしてきました。私はPrismにもかなり新しいです。私は他の人々の束縛の例を見てきましたが、どれもうまくいかないようです。それ以来、私は "Text ="の中にバインドして、テキストがクリアされた別のテキストボックスをクリックしています。私はTwoWay Mode、UpdatePropertyChangeなどを試しました。何も動作していないようです。私は値が本当にcsコードと一致するかどうかを確認するためにブレークポイントを入れました。しかし、それは縛らない。私は間違って何をしていますか?私は自分のテキストボックスを自分のビューモデル「UserName」の文字列値と同じにして、誰かがログインボタンをクリックしたときにその値がデータベースに存在するかどうかをチェックします。ここで問題バインディングWpfToolKitウォーターマークのテキストボックスプリズムを使用

はLogin.xamlは次のとおりです。

 <Grid x:Name="UserInputGrid" 
      Margin="15" 
      Height="100"> 
     <wpfTool:WatermarkTextBox x:Name="UsernameTextBox" 
            Width="600" 
            Height="100" 
            Text="{Binding UserName}" 
            Watermark="Username" 
            Cursor="IBeam" 
            FontFamily="Quicksand" 
            FontSize="72"/> 
    </Grid> 

LoginView.xaml.cs

public LoginView() 
    { 
     InitializeComponent(); 
     DataContext = new LoginViewModel(); 
    } 
} 

LoginViewModel.cs:

public class LoginViewModel : BindableBase 
{ 
    #region Private Variables 

    //Private Variables 

    bool isCanLogin = true; 
    private string _username; 
    private string _password; 
    #endregion 

    #region Public Variables 

    //Public Variables 

    public string UserName 
    { 
     get { return _username; } 
     set { RaisePropertyChanged("UserName"); } 
    } 
    public string Password 
    { 
     get { return _password; } 
     set { RaisePropertyChanged("Password"); } 
    } 
    public bool CanLogin() { return isCanLogin; } 

    #endregion 

    #region Commands 

    //Commands 

    RelayCommand _loginCommand; 
    public ICommand LoginCommand 
    { 
     get 
     { 
      if (_loginCommand == null) 
       _loginCommand = new RelayCommand(Login, CanLogin); 

      return _loginCommand; 
     } 
    } 
    #endregion 

    #region Functions and Methods 

    //Functions and Methods 

    private void Login() 
    { 
     try 
     { 
      isCanLogin = false; 
      SoundPlayers.ButtonSound(); 
      //Authentication and Checks the DB to see if the User exists 

      if (AuthenticationService.VerifyUser(UserName, Password)) 
      { 
       //Navigate to landing page 
       SoundPlayers.LoginSound(); 
      } 
      else 
      { 
       //Doesn't exist!?! 
      } 

      isCanLogin = true; 
     } 
     catch 
     { 
      //If Login requirements aren't met, or failed 
     } 
     finally 
     { 
      isCanLogin = true; 
     } 
    } 
    #endregion 
} 
+0

* "私はそれを"テキスト= "の中にバインドし、別のテキストボックスをクリックすると私のテキストはクリアされます。" * - あなたはあなたが 'UsernameTextBox'にテキストを入力すると言っていますか?フォーカスが失われると、ボックスに入力したテキストは破棄されますか? –

+0

はい、唯一の方法は、私がMode = OneWayなら、私は別の例を見ており、twowayはそうです。しかし、私が何かをするとき、カーソルを値UserNameに置いて、テキストボックスに入力した値があるかどうかを確認すると、 "Null"と表示されます。 (これは私がブレークポイントを置くときです) – Hypergyzed

答えて

2
には、次のような何かにあなたの財産セッターを変更

public string UserName 
{ 
    get { return _username; } 
    set { SetProperty(ref _username, value); } 
} 

をこの技術では、あなたがRaisePropertyChangedを呼び出す必要はありません、それはあなたのために行われます。そして、バッキング変数が変更された場合、変数が設定されます。

SetPropertyの方法は、Prism.Mvvm名前空間から得られます。

+0

これは完全に機能しました!どうもありがとうございます! – Hypergyzed

+0

@jtreimerあなたは、システムがあなたを可能にするとき、それを正しい回答として受け入れるべきです。 –

1

あなたのセッターが壊れています。プライベートバッキングフィールドは決して更新されません。コントロールはBindingを使用してプロパティを正しく更新していますが、プロパティは値を保存しません。同様にPasswordを更新する必要があります。

public string UserName 
{ 
    get { return _username; } 
    set { 
     if (_username != value) 
     { 
      _username = value; 
      RaisePropertyChanged("UserName"); 
     } 
    } 
} 
関連する問題