modelo ejemplo developer data-binding mvvm

data-binding - ejemplo - mvvm architecture diagram



Botones de radio MVVM (4)

Alguien por favor ayuda. Tengo un problema interesante Estoy tratando de implementar una aplicación MVVM y quiero vincularme a los botones de radio desde mi punto de vista.

Aquí está mi vista:

<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>

Aquí está mi 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"); } }

El problema es este, cuando hago clic en los diferentes botones de radio, solo se llama al ajustador de propiedades la primera vez (cuando ejecuto a través de la depuración). Por ejemplo, cuando hago clic en NoteGeneral, NoteContact, entonces NoteGeneral nuevamente solo los primeros dos clics actualizan mi viewmodel. Creo que podría haber algo mal con mi encuadernación, o tal vez me estoy acercando a esto de una manera completamente incorrecta.

¿Alguien puede ayudar?

¿Cómo debo implementar selecciones de botones de radio en mi modelo de vista?

.NET 4 y posterior

Este problema con el enlace de RadioButton fue resuelto por Microsoft cuando se lanzó .NET 4. La vinculación de RadioButtons ahora funciona como era de esperar sin ninguna de las soluciones alternativas que se enumeran a continuación.


Echa un vistazo here .

No he implementado la solución provista, pero tiene sentido. El control de marco subyacente rompe tus enlaces cuando se realiza un clic. La solución es anular el método que hace esto y solo confiar en los enlaces.


He escrito un consejo simple para este problema en mi blog.

En este caso, debe escribir View y ViewModel de la siguiente manera:

<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; } } ...


tienes que establecer UpdateSourceTrigger = "PropertyChanged" en el enlace XAML como

<StackPanel Grid.Column="1" Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center"> <RadioButton Name="rdbTimeFormat12" GroupName="TimeFormat" Content="12 Hrs" IsChecked="{Binding Radio1IsCheck,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <RadioButton Name="rdbTimeFormat24" GroupName="TimeFormat" Margin="40,0,0,0" Content="24 Hrs" IsChecked="{Binding Radio2IsCheck,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> </StackPanel>


Jaime Rodríguez , que trabaja en Microsoft en WPF, publica un Q & A completo en WPF, y el último número tiene una publicación en RadioButtons y MVVM.

La publicación está en http://blogs.msdn.com/jaimer/archive/2009/09/22/wpf-discussion-090922.aspx , y desea ver el último elemento en esa publicación. Probé la solución y funciona a mi satisfacción.

Citado por conveniencia:

He solucionado este problema en .NET 3.5 SP1. Así es como los datos vinculan un grupo de botones de radio a una propiedad con valor enum:

<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>

Establecer GroupName de cada botón de radio en un valor único evita que los enlaces se vean afectados cuando el usuario hace clic en un botón de opción. Aquí estoy confiando en la fuente de datos para implementar INotifyPropertyChanged, que indicará a los otros botones de radio que actualicen. Un enfoque similar debería funcionar para los botones de radio en un ItemsControl.