2008-10-31 11 views
11

Ich habe einige Radiobuttons in meiner XAML ... bekamWie kann ich die WPF-Optionsfelder am besten handhaben?

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

Und ich kann ihre Klick-Ereignisse in Visual Basic-Code verarbeiten. Dies funktioniert ...

Aber ich möchte es verbessern. Dieser Code schlägt fehl ...

<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 

In meiner XAML erhalte ich ein Blau auf den Command = Attribute verschnörkelten unterstreichen und diesen Tipp ...

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

In meinem VB ich eine grün unterstreichen verschnörkelt auf der Select Case Linie und diese Warnung ...

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

Noch besser wäre die Verwendung von Enum-Befehlen mit voller Intellisense und Kompilierfehler statt Laufzeitfehler im Falle von Tippfehlern. Wie kann ich das verbessern?

Antwort

18

Damit Befehle funktionieren, müssen Sie Bindings entweder in Ihrem XAML oder Code hinterlegen. Diese Befehlsbindungen müssen auf öffentliche statische Felder verweisen, die zuvor deklariert wurden.

Dann müssen Sie in Ihren Schaltflächen Befehlsattribut auch diese gleichen Befehle verweisen.

<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"); 
     } 
    } 
} 
+0

Ich habe das verwendet, aber wenn ich meine Seite lade, kann ich keine davon auswählen. Gibt es trotzdem die Möglichkeit RadioButtons auszuwählen? – paradisonoir

+0

Ich bin mir nicht sicher, was das Problem sein könnte, ich habe nur dieses Beispiel ausgeführt und ich war in der Lage, die Radio-Buttons ok zu wählen. –

+0

Wenn alle Optionsschaltflächen deaktiviert sind, würde ich annehmen, dass die Befehlsbindungen fehlgeschlagen sind, äh, bind. –

0

bessere Lösung WPF MVVM Design Muster mit:

Radiobutton XAML Control 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 

Man kann die gleiche Logik oben verwenden, um zu sehen, ob Sie ein Häkchen gesetzt haben ny der drei Radio Buttons viz. Option eins, Option zwei, Option drei. Wenn Sie jedoch überprüfen, ob die Boolesche Set-ID true oder false ist, können Sie feststellen, ob das Optionsfeld aktiviert ist oder nicht.

Verwandte Themen