#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, верно? Не знаю, является ли это наиболее эффективным способом, но он работает
-
добавляйте событие каждый раз, когда изменяется свойство 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; } }
-
настройте в вашей 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