2015-03-09 12 views
0

У меня есть 32 флажка на моем XAML. Я хочу проверить, какие из них выбраны пользователем.wpf logicy group controls

Есть ли способ группировать эти элементы управления и перебирать их, поэтому я могу избежать 32-х, если иное решение. Таким образом, вместо этого:

private List<int> GetSelectedPositions() 
    { 
     List<int> SelectedPositions = new List<int>(); 


     if (CheckBoxPos1.IsChecked == true) 
     { 
      SelectedPositions.Add(1); 
     } 
     else if (CheckBoxPos2.IsChecked == true) 
     { 
      SelectedPositions.Add(2); 
     } 

     //(...) 

     else if (CheckBoxPos32.IsChecked == true) 
     { 
      SelectedPositions.Add(2); 
     } 

     return SelectedPositions; 

    } 

Что-то вроде этого:

private List<int> GetSelectedPositions() 
    { 
     List<int> SelectedPositions = new List<int>(); 
     foreach (var item in collection) 
     { 
      if (item.IsChecked) { SelectedPositions.Add(item.position) } 

     } 
     return SelectedPositions; 
    } 
+1

Создайте список bools в вашей модели просмотра. Привяжите этот список к элементу управления и используйте флажок в качестве шаблона элемента. – poke

+0

@poke Почему вы не добавляете это в качестве ответа? как текст водяного знака в поле комментария говорит * Избегайте отвечать на вопросы в комментариях. * – Default

+1

@Default Потому что у меня не было достаточно времени для написания больше. И это одно не ответ. – poke

ответ

2

Если флажки в сетке или какого-либо контроля, которые могут иметь несколько детей, вы можете сделать что-то вроде этого:

 bool? isChecked = false; 
     foreach (var child in gdMain.Children.Cast<UIElement>()) 
     { 
      if (child is CheckBox) 
      { 
       isChecked = (child as CheckBox).IsChecked; 
      } 
     } 

gdMain это имя сетки

Вы можете даже пойти фантазии и используйте Linq, чтобы получить все флажки, которые были проверены, и поместите их в ienumerable или список:

var checkBoxes = gdMain.Children.OfType<CheckBox>().Where(x => x.IsChecked == true); 
var checkBoxes = gdMain.Children.OfType<CheckBox>().Where(x => x.IsChecked == true).ToList(); 
0

Если вы должны проверить все на 32 флажков, без фильтрации, вы можете получить все элементы управления флажок и проверить их Checked недвижимость , Вот пример кода:

var ctrls = this.Controls.OfType<System.Windows.Forms.CheckBox>().ToList(); 
foreach (var ctrl in ctrls) 
    if (((CheckBox)ctrl).Checked) 
    { 
     SelectedPositions.Add(item.position) 
    } 
0

ViewModel:

/// <summary> 
      /// The <see cref="IsChecked" /> property's name. 
      /// </summary> 
      public const string IsCheckedPropertyName = "IsChecked"; 

      private bool _IsChecked = false; 

      /// <summary> 
      /// Sets and gets the IsChecked property. 
      /// Changes to that property's value raise the PropertyChanged event. 
      /// </summary> 
      public bool IsChecked 
      { 
       get 
       { 
        return _IsChecked; 
       } 

       set 
       { 
        if (_IsChecked == value) 
        { 
         return; 
        } 

        RaisePropertyChanging(IsCheckedPropertyName); 
        _IsChecked = value; 
        RaisePropertyChanged(IsCheckedPropertyName); 
       } 
      } 

Xaml:

<CheckBox Margin="10" IsChecked="{Binding IsChecked,Mode=TwoWay}"/> 

Вы можете использовать MVVM архитектуры, как это с обязательным Ваше имя свойства с ним Так код будет легко understable и записываемый.