c# wpf listbox itemtemplate

c# - wpf listview grouping



¿Cómo eliminar elementos marcados de un cuadro de lista en WPF? (4)

Simplemente podría hacer un Model para usted Artículos con una propiedad Controlada, de esta manera, si cambia los datos en la UI, MyList se actualizará y si actualiza los elementos en MyList en el código, la IU reflejará los cambios.

Por lo tanto, si elimina todos los elementos MyList de MyList , se eliminarán de ListBox

public partial class MainWindow : Window { private ObservableCollection<MyObject> _myItems = new ObservableCollection<MyObject>(); public MainWindow() { InitializeComponent(); MyItems.Add(new MyObject { Name = "Test1" }); MyItems.Add(new MyObject { Name = "Test2" }); MyItems.Add(new MyObject { Name = "Test3" }); MyItems.Add(new MyObject { Name = "Test4" }); } public ObservableCollection<MyObject> MyItems { get { return _myItems; } set { _myItems = value; } } public void RemoveItems() { // Remove any items fro MyList that "IsChecked" } } public class MyObject : INotifyPropertyChanged { private string _name; private bool _isChecked; public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged("Name"); } } public bool IsChecked { get { return _isChecked; } set { _isChecked = value; NotifyPropertyChanged("IsChecked"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string property) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(property)); } } }

xaml:

<Window x:Class="WpfApplication8.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="199" Width="206" Name="UI"> <Grid DataContext="{Binding ElementName=UI}"> <ListBox ItemsSource="{Binding MyItems}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Padding="10" IsChecked="{Binding IsChecked}"> <CheckBox.LayoutTransform> <ScaleTransform ScaleX="1" ScaleY="1" /> </CheckBox.LayoutTransform> </CheckBox> <TextBlock Text="{Binding Name}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Window>

He estado trabajando en una aplicación de lista de verificación, y estoy usando un ListBox para mostrar los datos. Estoy usando matrices para poblar el ListBox función de qué botón presione el usuario. (No sé si es la mejor práctica, pero funciona por ahora). Una vez que el usuario haya completado los pasos, puede eliminar los elementos con este comando:

private void SendSelected() { while (lstToDo.SelectedItems.Count > 0) { lstToDo.Items.Remove(lstToDo.SelectedItem); } }

El problema es que hoy he aprendido a agregar ItemTemplate a mi ItemTemplate con el xaml a continuación:

<ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Padding="10"> <CheckBox.LayoutTransform> <ScaleTransform ScaleX="1" ScaleY="1" /> </CheckBox.LayoutTransform> </CheckBox> <TextBlock Text="{Binding}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate>

Ahora el botón Eliminar aún funciona ... sin embargo, me gustaría ajustarlo para que elimine los elementos marcados en lugar de los elementos seleccionados. En winforms, solía hacerlo así:

while (lstToDo.CheckedItems.Count > 0) { lstToDo.Items.Remove(lstToDo.CheckedItems[0]); }

Pero en WPF, obviamente este método no funciona, y no estoy seguro de por qué.


Utilice un contenedor en sus datos, que incluirá datos específicos de la vista, como la propiedad IsChecked. Vincula la propiedad al CheckBox y luego podrás encontrar todos los artículos que se han verificado ...

Ejemplo simple:

public class CheckedItem<T> where T : class { public T Data { get; set; } public bool IsChecked { get; set; } }

Entonces, en lugar de una lista de MyItem usted crea una lista de CheckedItem<MyItem>

No solo cambie el enlace en consecuencia:

<ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Padding="10" IsChecked={Binding IsChecked}> <CheckBox.LayoutTransform> <ScaleTransform ScaleX="1" ScaleY="1" /> </CheckBox.LayoutTransform> </CheckBox> <TextBlock Text="{Binding Data}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate>

Y si solo desea eliminar los elementos que están marcados, puede obtenerlos así:

List<CheckedItem<MyItem>> MyItems; ... ... foreach (var Item in MyItems) { if (!Item.IsChecked) { lstToDo.Items.Remove(Item); } }


puede vincular la casilla de verificación a la propiedad IsSelected del ListBoxItem

<DataTemplate> <CheckBox Content="{Binding .}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected" /> </DataTemplate>


private void RemoveButton_Click(object sender, RoutedEventArgs e) { foreach(CheckedItem in lstToDo.SelectedItems) { (lsttoDo.ItemsSource as List).Remove(CheckedItem); } lsttoDo.Items.Refresh(); }

En tu c# .