Aby uniknąć sytuacji, w której hasło jest dostępne w pamięci jako zwykły tekst w dowolnym punkcie, podałem wartość jako parametr do mojego polecenia.
<Label>User Name</Label>
<TextBox Text="{Binding UserName}" />
<Label>Password</Label>
<PasswordBox Name="PasswordBox" />
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0 16 0 0">
<Button Margin="0 0 8 0" MinWidth="65"
Command="{Binding LoginAccept}"
CommandParameter="{Binding ElementName=PasswordBox}">
Login
</Button>
<Button MinWidth="65" Command="{Binding LoginCancel}">Cancel</Button>
</StackPanel>
Następnie w moim modelu widoku.
public DelegateCommand<object> LoginAccept { get; private set; }
public DelegateCommand<object> LoginCancel { get; private set; }
public LoginViewModel {
LoginAccept = new DelegateCommand<object>(o => OnLogin(o), (o) => IsLoginVisible);
LoginCancel = new DelegateCommand<object>(o => OnLoginCancel(), (o) => IsLoginVisible);
}
private void OnLogin(object o)
{
var passwordBox = (o as System.Windows.Controls.PasswordBox);
var password = passwordBox.SecurePassword.Copy();
passwordBox.Clear();
ShowLogin = false;
var credential = new System.Net.NetworkCredential(UserName, password);
}
private void OnLoginCancel()
{
ShowLogin = false;
}
Chociaż byłoby sensu, aby zapewnić SecurePassword bezpośrednio od wiązania, to zawsze wydaje się zapewniać pustą wartość. Tak więc to NIE działa:
<Button Margin="0 0 8 0" MinWidth="65"
Command="{Binding LoginAccept}"
CommandParameter="{Binding ElementName=PasswordBox, Path=SecurePassword}">
Czy masz pewność, że datacontext okna jest ustawiony na model widoku. Musisz dodać trochę kodu, abyśmy mogli zrozumieć Twój problem. –
DataContext jest w porządku. inne właściwości działają dobrze, ale z PasswordBox nie mogę. – Rangel