protected override CredentialSettings UpdateCredential(string endPoint, string realm, CredentialSettings oldCredential) { // argument checks Debug.Assert(endPoint != null); Debug.Assert(realm != null); // may be empty // oldCredential can be null // state checks Debug.Assert(this.app != null); // clone the CredentialSettings CredentialSettings credentialSettings; if (oldCredential != null) { credentialSettings = CredentialSettings.Clone(oldCredential); } else { credentialSettings = new CredentialSettings(); // set default Persistence value to Session (i.e. volatile) // The default value reverted because it was confusing. // credentialSettings.Persistence = CredentialPersistence.Session; } credentialSettings.EndPoint = endPoint; // ask user's credential Func <CredentialSettings> callback = () => { // get the MainWindow // Note that the MainWindow can be accessed only from the GUI thread // (that is, it must be gotten inside this callback) Window mainWindow = this.app.MainWindow; // prepare CredentialDialog CredentialDialog dialog = new CredentialDialog(credentialSettings); dialog.Title = realm; if (mainWindow != null) { dialog.Owner = mainWindow; } // show the credential dialog and get user input this.credentialDialog = dialog; try { return((dialog.ShowDialog() ?? false) ? dialog.CredentialSettings : null); } finally { this.credentialDialog = null; } }; return(this.app.Dispatcher.Invoke <CredentialSettings>(callback)); }
private void editCredentialButton_Click(object sender, RoutedEventArgs e) { try { ListView listView = this.credentialListView; // get the selected CredentialSettings CredentialSettings originalItem = listView.SelectedItem as CredentialSettings; if (originalItem == null) { // this item is not editable return; } // create a clone of the selected CredentialSettings CredentialSettings newItem = CredentialSettings.Clone(originalItem); // prepare a validator CredentialSettings[] items = listView.Items.Cast <CredentialSettings>().ToArray(); Func <CredentialSettings, string> validator = (s) => { // check there is no credential which is for the same end point CredentialSettings conflicting = items.Where(item => (item != originalItem && s.HasSameEndPoint(item))).FirstOrDefault(); return((conflicting == null) ? null : string.Format(Properties.Resources.SettingsWindow_Message_ConflictingCredential, s.EndPoint)); }; // edit the clone CredentialDialog dialog = new CredentialDialog(newItem, validator, endPointEditable: true); dialog.Owner = this; if (dialog.ShowDialog() ?? false) { ReplaceSelectedListItemWith(listView, dialog.CredentialSettings); } } catch (Exception exception) { ShowErrorDialog(exception.Message); } return; }