visual tutorial studio presentacion example español ejemplos .net wpf vb.net xaml

.net - tutorial - wpf xaml



¿Cómo puedo manejar mejor los botones de radio WPF? (2)

Para que los comandos funcionen, debes configurar los enlaces en tu xaml o código detrás. Estos enlaces de comando deben hacer referencia a los campos públicos estáticos que se han declarado previamente.

Luego, en los botones Comando de atributo, necesitarás también hacer referencia a estos mismos comandos.

<Window x:Class="RadioButtonCommandSample.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RadioButtonCommandSample" Title="Window1" Height="300" Width="300" > <Window.CommandBindings> <CommandBinding Command="{x:Static local:Window1.CommandOne}" Executed="CommandBinding_Executed"/> <CommandBinding Command="{x:Static local:Window1.CommandTwo}" Executed="CommandBinding_Executed"/> <CommandBinding Command="{x:Static local:Window1.CommandThree}" Executed="CommandBinding_Executed"/> </Window.CommandBindings> <StackPanel> <RadioButton Name="RadioButton1" GroupName="Buttons" Command="{x:Static local:Window1.CommandOne}" IsChecked="True">One</RadioButton> <RadioButton Name="RadioButton2" GroupName="Buttons" Command="{x:Static local:Window1.CommandTwo}">Two</RadioButton> <RadioButton Name="RadioButton3" GroupName="Buttons" Command="{x:Static local:Window1.CommandThree}">Three</RadioButton> </StackPanel> </Window> public partial class Window1 : Window { public static readonly RoutedCommand CommandOne = new RoutedCommand(); public static readonly RoutedCommand CommandTwo = new RoutedCommand(); public static readonly RoutedCommand CommandThree = new RoutedCommand(); public Window1() { InitializeComponent(); } private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { if (e.Command == CommandOne) { MessageBox.Show("CommandOne"); } else if (e.Command == CommandTwo) { MessageBox.Show("CommandTwo"); } else if (e.Command == CommandThree) { MessageBox.Show("CommandThree"); } } }

Tengo algunos RadioButtons en mi XAML ...

<StackPanel> <RadioButton Name="RadioButton1" GroupName="Buttons" Click="ButtonsChecked" IsChecked="True">One</RadioButton> <RadioButton Name="RadioButton2" GroupName="Buttons" Click="ButtonsChecked">Two</RadioButton> <RadioButton Name="RadioButton3" GroupName="Buttons" Click="ButtonsChecked">Three</RadioButton> </StackPanel>

Y puedo manejar sus eventos de clics en el código de Visual Basic. Esto funciona...

Private Sub ButtonsChecked(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Select Case CType(sender, RadioButton).Name Case "RadioButton1" ''Do something one Exit Select Case "RadioButton2" ''Do something two Exit Select Case "RadioButton3" ''Do something three Exit Select End Select End Sub

Pero, me gustaría mejorarlo. Este código falla ...

<StackPanel> <RadioButton Name="RadioButton1" GroupName="Buttons" Click="ButtonsChecked" Command="one" IsChecked="True">One</RadioButton> <RadioButton Name="RadioButton2" GroupName="Buttons" Click="ButtonsChecked" Command="two">Two</RadioButton> <RadioButton Name="RadioButton3" GroupName="Buttons" Click="ButtonsChecked" Command="three">Three</RadioButton> </StackPanel>

Private Sub ButtonsChecked(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Select Case CType(sender, RadioButton).Command Case "one" ''Do something one Exit Select Case "two" ''Do something two Exit Select Case "three" ''Do something three Exit Select End Select End Sub

En mi XAML obtengo un subrayado ondulado azul en los atributos Command = y este consejo ...

''CommandValueSerializer'' ValueSerializer cannot convert from ''System.String''.

En mi VB obtengo un subrayado ondulado verde en la línea Seleccionar caso y esta advertencia ...

Runtime errors might occur when converting ''System.Windows.Input.ICommand'' to ''String''.

Aún mejor sería usar comandos de tipo Enum con Intellisense completo y errores de compilación en lugar de errores de tiempo de ejecución en caso de errores tipográficos. ¿Cómo puedo mejorar esto?


Mejor solución usando el patrón de diseño WPF MVVM:

Control de botón de radio XAML a Modelview.vb / ModelView.cs:

XAML Code: <RadioButton Content="On" IsEnabled="True" IsChecked="{Binding OnJob}"/> <RadioButton Content="Off" IsEnabled="True" IsChecked="{Binding OffJob}"/>

ViewModel.vb:

Private _OffJob As Boolean = False Private _OnJob As Boolean = False Public Property OnJob As Boolean Get Return _OnJob End Get Set(value As Boolean) Me._OnJob = value End Set End Property Public Property OffJob As Boolean Get Return _OffJob End Get Set(value As Boolean) Me._OffJob = value End Set End Property Private Sub FindCheckedItem() If(Me.OnJob = True) MessageBox.show("You have checked On") End If If(Me.OffJob = False) MessageBox.Show("You have checked Off") End sub

Uno puede usar la misma lógica de arriba para ver si marcó alguno de los tres botones de radio. Opción uno, opción dos, opción tres. Pero si comprueba si el valor booleano es verdadero o falso, puede identificar si el botón de opción está marcado o no.