2017-05-23 8 views
0

그래서, 내가 잘못하고있는 것을 알아 내려고 노력하면서 너무 많은 시간을 보냈습니다. 나는 프리즘 (Prism)에 대해서도 상당히 익숙하다. 나는 다른 사람들을 묶는 예를 보았지만 그들 중 누구도 일하는 것처럼 보이지 않는다. 나에게있어서 "텍스트 ="안에 바인딩하고 내 텍스트가 지워지는 다른 텍스트 상자를 클릭하는 것입니다. TwoWay Mode, UpdatePropertyChange 등을 시도해 보았습니다. 아무 것도 작동하지 않는 것 같습니다. 심지어 값이 CS 코드와 실제로 일치하는지 확인하기 위해 중단 점을 넣었습니다. 그러나 아니, 그것은 구속력이 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는 텍스트 박스가 내 ViewModels "UserName"문자열 값과 같아서 로그인 버튼을 클릭했을 때 값을 검사하여 데이터베이스에 있는지 확인합니다.트러블 바인딩 WpfToolKit 워터 마크 텍스트 박스 프리즘 사용

 <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

귀하의 세터 깨진 여기에

는 Login.xaml입니다. 그들은 개인 백업 필드를 업데이트하지 않습니다. 컨트롤은 바인딩을 통해 속성을 올바르게 업데이트하지만 들어오는 값을 저장하지 않습니다. 마찬가지로 Password을 업데이트해야합니다.

public string UserName 
{ 
    get { return _username; } 
    set { 
     if (_username != value) 
     { 
      _username = value; 
      RaisePropertyChanged("UserName"); 
     } 
    } 
}