我一直在研究清单应用程序,我正在使用ListBox
来显示数据。
我正在使用数组根据用户按下的按钮填充ListBox
。
(我不知道这是不是最好的做法,但它现在有效。)一旦用户完成了这些步骤,他就可以用这个命令删除这些项目:
private void SendSelected()
{
while (lstToDo.SelectedItems.Count > 0)
{
lstToDo.Items.Remove(lstToDo.SelectedItem);
}
}
问题在于,今天我已经学会了如何使用下面的xaml将CheckBox
es添加到我的ItemTemplate
:
<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>
现在删除按钮仍然有效......但是我想调整它以便删除选中的项而不是选中的项。 在winforms中,我曾经这样做过:
while (lstToDo.CheckedItems.Count > 0)
{
lstToDo.Items.Remove(lstToDo.CheckedItems[0]);
}
但是在WPF中,显然这种方法不起作用,我只是不确定原因。
答案 0 :(得分:2)
您可以将复选框绑定到ListBoxItem的IsSelected属性
<DataTemplate>
<CheckBox Content="{Binding .}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected" />
</DataTemplate>
答案 1 :(得分:0)
在数据上使用包装器,其中包含特定于视图的数据,例如IsChecked属性。将属性绑定到CheckBox,然后您就可以找到已经检查过的所有项目......
简单示例:
public class CheckedItem<T> where T : class
{
public T Data { get; set; }
public bool IsChecked { get; set; }
}
因此,您需要创建一个MyItem
CheckedItem<MyItem>
列表
不只是相应地更改绑定:
<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>
如果您只想删除已选中的项目,您可以按照以下方式删除它们:
List<CheckedItem<MyItem>> MyItems;
...
...
foreach (var Item in MyItems)
{
if (!Item.IsChecked)
{
lstToDo.Items.Remove(Item);
}
}
答案 2 :(得分:0)
private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
foreach(CheckedItem in lstToDo.SelectedItems)
{
(lsttoDo.ItemsSource as List).Remove(CheckedItem);
}
lsttoDo.Items.Refresh();
}
在c#
。
答案 3 :(得分:0)
您可以为具有Checked属性的项目创建Model
,这样如果您更改了UI中的数据,MyList
将会更新,并且您更新了MyList
中的项目在代码中,UI将反映更改。
因此,如果您从MyList
删除所有已检查的项目,则会从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>