40 votes

Boutons

Quelqu'un s'il vous plaît aider. J'ai un problème intéressant. Je suis en train de mettre en œuvre un MVVM application et je veux lier aux composants radiobutton de mon point de vue.

Voici mon avis:

<StackPanel Orientation="Horizontal" Grid.ColumnSpan="2"  >
    <RadioButton GroupName="1" IsChecked="{Binding Path=NoteGeneral, Mode=TwoWay}">General</RadioButton>
    <RadioButton GroupName="1" IsChecked="{Binding Path=NoteContact, Mode=TwoWay}" >Contact</RadioButton>
    <RadioButton GroupName="1" IsChecked="{Binding Path=NoteAddress, Mode=TwoWay}" >Address</RadioButton>
    <RadioButton GroupName="1" IsChecked="{Binding Path=NotePhone, Mode=TwoWay}" >Phone</RadioButton>
</StackPanel>

Voici mon ViewModel:

    bool _NoteGeneral;
    public bool NoteGeneral
    {
        get { return _NoteGeneral; }
        set
        {
            _NoteGeneral = value;
            OnPropertyChanged("NoteGeneral");
        }
    }

    bool _NoteContact;
    public bool NoteContact
    {
        get { return _NoteContact; }
        set
        {
            _NoteContact = value;
            OnPropertyChanged("NoteContact");
        }
    }

    bool _NoteAddress;
    public bool NoteAddress
    {
        get { return _NoteAddress; }
        set
        {
            _NoteAddress = value;
            OnPropertyChanged("NoteAddress");
        }
    }

    bool _NotePhone;
    public bool NotePhone
    {
        get { return _NotePhone; }
        set
        {
            _NotePhone = value;
            OnPropertyChanged("NotePhone");
        }
    }

Le problème est le suivant, lorsque je clique sur les différents composants radiobutton la propriété setter seulement est appelée la première fois(quand j'passage de débogage). par exemple, Lorsque je clique sur NoteGeneral, NoteContact, puis NoteGeneral de nouveau seules les deux premières clique sur mettre à jour mon viewmodel. Je pense que je pourrais avoir quelque chose de mal avec mon contraignante, ou peut-être je me rapproche de cette complètement mauvais sens.

Quelqu'un peut-il aider?

Comment dois-je mettre en œuvre radiobutton sélections dans mon viewmodel?

18voto

Jab Points 8901

Jetez un coup d'oeil ici .

Je n'ai pas implémenté la solution fournie mais c'est logique. Le contrôle de structure sous-jacent rompt vos liaisons lorsqu'un clic est effectué. La solution consiste à remplacer la méthode qui le fait et à ne compter que sur les liaisons.

16voto

Thomas Dufour Points 739

Jaime Rodriguez, qui travaille chez Microsoft WPF, publie une intégrale Q&A sur WPF, et la dernière question a un post sur les composants radiobutton et MVVM !

Le poste est à http://blogs.msdn.com/jaimer/archive/2009/09/22/wpf-discussion-090922.aspxet que vous voulez regarder le dernier élément de ce post. J'ai testé la solution et cela fonctionne pour ma satisfaction.

Cité pour plus de commodité:

J'ai travaillé autour de cette question .NET 3.5 SP1. Voici comment j'ai lier des données à un groupe de boutons radio pour un enum valeur de la propriété:

<StackPanel>
    <RadioButton Content="New folder"
        IsChecked="{Binding Path=PublishTarget,
                    Converter={StaticResource equalityConverter},
                    ConverterParameter={x:Static local:PublishTarget.NewServerFolder}, Mode=TwoWay}"
        GroupName="1" />

    <RadioButton Content="Existing folder"
        IsChecked="{Binding Path=PublishTarget,
                    Converter={StaticResource equalityConverter},
                    ConverterParameter={x:Static local:PublishTarget.ExistingServerFolder},
                    Mode=TwoWay}"
        GroupName="2" />

    <RadioButton Content="Local folder"
        IsChecked="{Binding Path=PublishTarget,
                    Converter={StaticResource equalityConverter},
                    ConverterParameter={x:Static local:PublishTarget.LocalFolder},
                    Mode=TwoWay}"
        GroupName="3" />
</StackPanel>

La définition de chaque bouton radio du GroupName à une valeur unique, empêche les liaisons de se ridiculiser lorsque l'utilisateur clique sur un bouton radio. Ici, je suis plutôt sur la source de données pour implémenter INotifyPropertyChanged, qui va le dire aux autres boutons radio pour la mise à jour. Une approche similaire devrait fonctionner pour les boutons radio dans un ItemsControl.

8voto

Ryeol Points 89

J'ai écrit une astuce simple pour résoudre ce problème sur mon blog.

Dans ce cas, vous devez écrire les vues View et ViewModel comme suit:

 <StackPanel Orientation="Horizontal" Grid.ColumnSpan="2">
    <RadioButton IsChecked="{Binding IsGeneralNote}">General</RadioButton>
    <RadioButton IsChecked="{Binding IsContactNote}">Contact</RadioButton>
    <RadioButton IsChecked="{Binding IsAddressNote}">Address</RadioButton>
    <RadioButton IsChecked="{Binding IsPhoneNote}">Phone</RadioButton>
</StackPanel>
 


 public enum Note
{
    General,
    Contact,
    Address,
    Phone,
}

...

    Note note = Note.General;

    public Note Note
    {
        get { return this.note; }
        set
        {
            if (this.note == value)
                return;

            this.note = value;
            OnPropertyChanged("Note");
            OnPropertyChanged("IsGeneralNote");
            OnPropertyChanged("IsContactNote");
            OnPropertyChanged("IsAddressNote");
            OnPropertyChanged("IsPhoneNote");
        }
    }

    public bool IsGeneralNote
    {
        get { return Note == Note.General; }
        set { Note = value ? Note.General : Note; }
    }

    public bool IsContactNote
    {
        get { return Note == Note.Contact; }
        set { Note = value ? Note.Contact : Note; }
    }

    public bool IsAddressNote
    {
        get { return Note == Note.Address; }
        set { Note = value ? Note.Address : Note; }
    }

    public bool IsPhoneNote
    {
        get { return Note == Note.Phone; }
        set { Note = value ? Note.Phone : Note; }
    }
...
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X