Флажок из ComboBoxItem привязан к логическому значению в классе. Как получить каждое логическое значение из каждого отдельного элемента?

#c# #wpf #xaml #checkbox #combobox

#c# #wpf #xaml #флажок #combobox

Вопрос:

Извините за мой недостаток английского языка и имейте в виду, что я только начинаю с WPF, так что это может быть даже не самый красивый способ сделать это.

Я пытался удалить каждый элемент, в котором установлен флажок, но у меня возникли проблемы с указанием флажка. Итак, я попытался указать на логическое значение внутри класса. Но есть и проблемы. Затем я сдался и пришел сюда.

Любая помощь приветствуется.

Моя кнопка, которая должна удалить определенный элемент с установленным флажком из списка, выглядит следующим образом.

 private void DeleteComboBoxItem_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < ComboBoxName.Items.Count; i  )
            {
                if (ComboBoxName.Item.Contains((CheckBox).Equals(True))) <--- Have Problems here.
                {
                    List.RemoveAt(i);
                }
            }
        }
  

В списке есть только имя кошки — у меня есть формула, в которую я могу добавлять имена кошек.

У меня есть поле со списком со следующим шаблоном:

 <ComboBox x:Name="ComboBoxName">
     <ComboBox.ItemTemplate>
           <DataTemplate>
                <Grid HorizontalAlignment="Stretch">
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="Auto"/>
                         <ColumnDefinition Width="*"/>
                     </Grid.ColumnDefinitions>
                     <CheckBox Grid.Column="0" IsChecked="{Binding b_CheckBox}" VerticalContentAlignment="Center"/>
                     <TextBlock Grid.Column="1" Text="{Binding tb_Name}" />
                </Grid>
           </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>
  

И класс, который выглядит примерно так.

 public class Cat 
{
public bool b_Checkbox {get; set;}
public string tb_Name {get; set;}
}
  

Надеюсь, вы сможете мне помочь.

Ответ №1:

Вы хотите, чтобы флажок вызывал удаление cat, верно? Не знаю, является ли это наиболее эффективным способом, но он работает

  1. добавляйте событие каждый раз, когда изменяется свойство bool в вашем классе Cat:

      public class Cat 
     {
    
         public event Action<bool> CheckboxChanged;
    
         private bool imChecked;
         public bool ImChecked
         {
             get
             {
                 return imChecked;
             }
             set
             {
                 imChecked = value;
                 CheckboxChanged?.Invoke(value);
             }
         }
    
    
         public string tb_Name { get; set; }            
     }     
      
  2. настройте в вашей ViewModel действие, которое вы хотите выполнять каждый раз, когда срабатывает это событие

  //In the constructor of your ViewModel, iterate through each cat and subscribe to its event. Then, give the cats to the comboBox
 public YourViewModel()
        {
            InitializeComponent();


            //Getting the cats
            ObservableCollection<Cat> Cats = new ObservableCollection<Cat>
            {
                new Cat () {tb_Name = "1st cat", ImChecked = false},
                new Cat () {tb_Name = "2nd cat", ImChecked = false},
                new Cat () {tb_Name = "3rd cat", ImChecked = false},
                new Cat () {tb_Name = "4th cat", ImChecked = false},
            };

           //Subscribing to each cat's event
            foreach (Cat cat in Cats)
            {
                cat.CheckboxChanged  = CatChanged;
            }

            //Give the comboBox the cats
            YourComboBox.ItemsSource = Cats;           
        }


 //This is what's gonna happen each time the ImChecked propierty in a cat changes
 private void CatChanged(bool catIsChecked)
        {
            //Create a empty collection to add the cats that are not checked
            ObservableCollection<Cat> catsToKeep = new ObservableCollection<Cat>();

            //Grab the ones not checked
            for (int i = 0; i < YourComboBox.Items.Count; i  )
            {
                Cat currentCat = YourComboBox.Items[i] as Cat;

                if (currentCat.ImChecked == false)
                {
                    catsToKeep.Add(currentCat);
                }
            }
            
            //Give the unchecked cats to the comboBox again
            YourComboBox.ItemsSource = catsToKeep;
        }

  

Xaml:

 <ComboBox x:Name="YourComboBox"
                      Height="30"
                      Width="150">
                
                <ComboBox.ItemTemplate>
                    <DataTemplate>

                        <CheckBox IsChecked="{Binding ImChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                            <TextBlock Text="{Binding tb_Name}"/>
                        </CheckBox>

                    </DataTemplate>
                </ComboBox.ItemTemplate>

            </ComboBox>


  

Комментарии:

1. Большое вам спасибо <3