2017-01-31 7 views
0

Je fais un widget silverlight, où je besoin les utilisateurs pour pouvoir sélectionner les caractères alphabétiques dans une grille comme ceci:Utilisez les boutons radio pour sélectionner les caractères alphabétiques dans silverlight (XAML)

enter image description here

Et si je clique sur l'un dans la rangée supérieure, elle ressemblera à ceci:

enter image description here

dans le viewmodel il sera représenté comme une chaîne comme un chararray, de sorte que 1 contient un tableau avec, i et 2 contient un tableau avec d, h et ainsi de suite. Maintenant, ma question est la suivante: quelle est la meilleure façon de représenter cela?

Mon idée initiale était d'avoir radioButtons, groupés par lettre.

<RadioButton GroupName="a" Grid.Column="1" Grid.Row="1" IsChecked="{Binding 1, Mode=TwoWay, Converter={StaticResource BSMClassConverter}, ConverterParameter='a'}" ></RadioButton> 
<RadioButton GroupName="a" Grid.Column="1" Grid.Row="2" IsChecked="{Binding 2, Mode=TwoWay, Converter={StaticResource BSMClassConverter}, ConverterParameter='a'}" ></RadioButton> 
<RadioButton GroupName="a" Grid.Column="1" Grid.Row="3" IsChecked="{Binding 3, Mode=TwoWay, Converter={StaticResource BSMClassConverter}, ConverterParameter='a'}" ></RadioButton> 

Et alors un convertisseur pour convertir l'information en une chaîne. Mais je ne peux pas comprendre comment cela va fonctionner. J'espère qu'il ya quelqu'un là-bas avec une bonne idée :-)

Répondre

2

Je suis sûr qu'il ya une meilleure façon de le faire, mais cela fonctionne, en utilisant les commandes plutôt que des convertisseurs:

<Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 

    <RadioButton Content="a" GroupName="a" Grid.Row="0" Grid.Column="0" Command="{Binding UpdateSelection}" CommandParameter="1;a" /> 
    <RadioButton Content="a" GroupName="a" Grid.Row="1" Grid.Column="0" Command="{Binding UpdateSelection}" CommandParameter="2;a" /> 
    <RadioButton Content="a" GroupName="a" Grid.Row="2" Grid.Column="0" Command="{Binding UpdateSelection}" CommandParameter="3;a" /> 

    <RadioButton Content="b" GroupName="B" Grid.Row="0" Grid.Column="1" Command="{Binding UpdateSelection}" CommandParameter="1;b" /> 
    <RadioButton Content="b" GroupName="B" Grid.Row="1" Grid.Column="1" Command="{Binding UpdateSelection}" CommandParameter="2;b" /> 
    <RadioButton Content="b" GroupName="B" Grid.Row="2" Grid.Column="1" Command="{Binding UpdateSelection}" CommandParameter="3;b" /> 

    <RadioButton Content="c" GroupName="C" Grid.Row="0" Grid.Column="2" Command="{Binding UpdateSelection}" CommandParameter="1;c" /> 
    <RadioButton Content="c" GroupName="C" Grid.Row="1" Grid.Column="2" Command="{Binding UpdateSelection}" CommandParameter="3;c" /> 
    <RadioButton Content="c" GroupName="C" Grid.Row="2" Grid.Column="2" Command="{Binding UpdateSelection}" CommandParameter="3;c" /> 

</Grid> 

Et dans votre ViewModel:

List<string> row1List = new List<string>(); 
    List<string> row2List = new List<string>(); 
    List<string> row3List = new List<string>(); 

    public RelayCommand<string> UpdateSelection { get; private set; } 

    public MainViewModel() 
    { 
     UpdateSelection = new RelayCommand<string>((str) => UpdateSelectionExecute(str)); 
    } 

    private void UpdateSelectionExecute(string str) 
    { 
     string[] split = str.Split(';'); 

     switch (split[0]) 
     { 
      case "1": 
       Remove(split[1]); 
       row1List.Add(split[1]); 
       break; 
      case "2": 
       Remove(split[1]); 
       row2List.Add(split[1]); 
       break; 
      case "3": 
       Remove(split[1]); 
       row3List.Add(split[1]); 
       break; 
     } 

     OutputToConsole(); 

    } 

    private void Remove(string character) 
    { 
     if (row1List.Contains(character)) 
     { 
      row1List.Remove(character); 
     } 

     if (row2List.Contains(character)) 
     { 
      row2List.Remove(character); 
     } 

     if (row3List.Contains(character)) 
     { 
      row3List.Remove(character); 
     } 
    } 

    private void OutputToConsole() 
    { 
     Console.WriteLine("List 1: "); 
     row1List.OrderBy(o => o).ToList().ForEach((c) => Console.Write(c)); 
     Console.WriteLine(""); 


     Console.WriteLine("List 2: "); 
     row2List.OrderBy(o => o).ToList().ForEach((c) => Console.Write(c)); 
     Console.WriteLine(""); 


     Console.WriteLine("List 3: "); 
     row3List.OrderBy(o => o).ToList().ForEach((c) => Console.Write(c)); 
     Console.WriteLine(""); 
    }