8
votes

Modifier la boîte de dialogue, avec des liaisons et OK / Annuler dans WPF

Comment puis-je avoir une boîte de dialogue pour modifier les propriétés d'une classe avec une liaison et avoir OK-Annuler dans la boîte de dialogue?

Ma première idée était ceci: p>

public partial class EditServerDialog : Window {
    private NewsServer _newsServer;

    public EditServerDialog(NewsServer newsServer) {
        InitializeComponent();

        this.DataContext = (_newsServer = newsServer).Clone();
    }

    private void ButtonClick(object sender, RoutedEventArgs e)
    {
        switch (((Button)e.OriginalSource).Content.ToString()) {
            case "OK":
                _newsServer = (NewsServer)this.DataContext;
                this.Close();
                break;
            case "Cancel":
                this.Close();
                break;
        }
    }
}


2 commentaires

Cela pourrait vous aider si vous montrez la configuration de la liaison.


Exemple de liaison: {Néannithéthentification de la liaison, UpdatesTourceRigger = LostFocus, Mode = Twoway}. La liaison est correcte parce que cela.DataContext contient les données correctes.


3 Réponses :


1
votes

L'instance originale de votre code> NewsSnerver code> n'est pas modifiée car vous ne l'avez pas réellement modifié. Une fois que votre constructeur est appelé, vous avez les trois code> code> Références: xxx pré>

Une fois le bouton OK en cliquant sur les références suivies: P>

NewsServer newsServer = ...;
EditServerDialog editServerDialog = new EditServerDialog(newsServer);

if (editServerDialog.ShowDialog() == true)
{
    newsServer = editServerDialog.DataContext;
}


1 commentaires

Comment devrais-je faire cela et pour toujours être en mesure d'annuler et / ou d'appliquer?



3
votes

Une ancienne question mais je vais y répondre pour les futurs lecteurs ...

Vous devez définir updatedatefetrigger = "explicite" code> sur vos liaisons afin de ne pas mettre à jour la source réelle jusqu'à ce que l'utilisateur clique sur OK . Ensuite, sur votre gestionnaire de bouton OK, vous pouvez écrire: P>

BindingExpression be = MyTextBox.GetBindingExpression(TextBox.TextProperty);  
if (be!=null) be.UpdateTarget(); 


0 commentaires

6
votes

C'est une question ancienne, mais je l'ai récemment rencontrée et trouvée, il y a une meilleure façon de le gérer avec .NET 4.5.

Premier, marquez les mises à jour de vos liaisonsOrCetrigger comme explicite: P>

foreach (var be in BindingOperations.GetSourceUpdatingBindings(this))
{
    be.UpdateSource();
}


0 commentaires