2016-07-27 9 views
0

Ich habe eine Anwendung gemacht, die aus einer datePicker und einer comboBox besteht. Die comboBox hat eine Liste von Zahlen von 0 bis 5. Wenn der Benutzer wählt "1" mit der comboBox mein datePicker "dpkClaim1" wird aktiviert, aber der Rest meiner datePickers wird deaktiviert. Wenn der Benutzer 2 auswählt, werden sowohl dpkClaim1 als auch dpkClaim2 aktiviert, wenn der Benutzer 3 dpkClaim1dpkClaim2dpkClaim3 aktiviert und so weiter aktiviert. Ich frage mich, ob ich einen Schalter statt einer Reihe von if-Anweisungen verwenden könnte, um saubereren Code zu liefern.Wie man eine switch-Anweisung macht wpf

Mein Code ist wie Brachen

XAML

<ComboBox x:Name="cbxNoClaims" SelectionChanged="cbxNoClaims_SelectionChanged" Loaded="cbxNoClaims_Loaded" Grid.Row="13" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Top" Width="120"/> 
<DatePicker Name="dpkClaim1" Grid.Row="13" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Top"/> 
<DatePicker Name="dpkClaim2" Grid.Row="14" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Top"/> 
<DatePicker Name="dpkClaim3" Grid.Row="15" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Top"/> 
<DatePicker Name="dpkClaim4" Grid.Row="16" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Top"/> 

xaml.cs

private void cbxNoClaims_Loaded(object sender, RoutedEventArgs e) 
{ 
    // ... A List. 
    List<string> claim = new List<string>(); 
    claim.Add("0 "); 
    claim.Add("1"); 
    claim.Add("2"); 
    claim.Add("3"); 
    claim.Add("4"); 
    claim.Add("5"); 


    // ... Get the ComboBox reference. 
    var comboBox = sender as ComboBox; 

    // ... Assign the ItemsSource to the List. 
    comboBox.ItemsSource = claim; 
    comboBox.SelectedIndex = 0; 
} 

private void cbxNoClaims_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (cbxNoClaims.SelectedItem.ToString() == "1") 
    { 
     dpkClaim1.IsEnabled = true; 
    } 

    else 
    { 
     dpkClaim1.IsEnabled = false; 
     dpkClaim2.IsEnabled = false; 
    } 
    if (cbxNoClaims.SelectedItem.ToString() == "2") 
    { 
     dpkClaim1.IsEnabled = true; 
     dpkClaim2.IsEnabled = true; 

    } 
    else 
    { 

     dpkClaim2.IsEnabled = false; 
    } 
    if (cbxNoClaims.SelectedItem.ToString() == "3") 
    { 
     dpkClaim1.IsEnabled = true; 
     dpkClaim2.IsEnabled = true; 
     dpkClaim3.IsEnabled = true; 

    } 
    else 
    { 

     dpkClaim3.IsEnabled = false; 
    } 
    if (cbxNoClaims.SelectedItem.ToString() == "4") 
    { 
     dpkClaim1.IsEnabled = true; 
     dpkClaim2.IsEnabled = true; 
     dpkClaim3.IsEnabled = true; 
     dpkClaim4.IsEnabled = true; 

    } 
    else 
    { 

     dpkClaim4.IsEnabled = false; 
    } 

Antwort

1

Im OnChanged Falle der Combobox Sie so etwas wie dies tun wollen:

switch (combobox.SelectedItem) { 
case "1": 
datebox1.IsEnabled = true; 
break; 
case "2": 
datebox1.IsEnabled = true; 
datebox2.IsEnabled = true; 
break; 
default: 
//what you want when nothing is selected 
break; 
} 
1

Sicher Sie können. Vielleicht möchten Sie jedoch die Art und Weise, wie Sie Dinge in Ihrem Projekt tun, überdenken (siehe H.B.'s Antwort).

switch(cbxNoClaims.SelectedItem) { 
    case "1": 
     // code here 
     break; 
    case "2": 
     // also here 
     break; 
    // etc... 
} 
0

Wäre gar nicht mit konkreten Fällen arbeiten, anstatt eine Liste von Modellen erstellen auf der Grundlage der gewählten Nummer, dann ein ItemsControl mit ItemTemplate bindet die ComboBox zu, dass enthält. Dies ergibt n Eingänge, ohne dass irgendetwas deaktiviert werden muss.

3

Dieses viel vereinfacht werden könnte:

cbxNoClaims.ItemsSource = Enumerable.Range(1, 6); 
var count = (int)cbxNoClaims.SelectedItem; 
dpkClaim1.IsEnabled = count >= 1; 
dpkClaim2.IsEnabled = count >= 2; 
dpkClaim3.IsEnabled = count >= 3; 
dpkClaim4.IsEnabled = count >= 4; 
dpkClaim5.IsEnabled = count >= 5; 
dpkClaim6.IsEnabled = count >= 6; 

Obwohl noch sollten Sie wirklich Verwenden Sie data binding und data templating.