如何显示复选框实际上已被选中
How to show that the checkbox is actually checked
我正在编写一个程序,允许用户 select 多个文件并使事情发生在他们身上。我使用复选框 select 将所有需要的文件绑定到 ListView。我需要一个按钮来一次 select 所有文件。后端部分有效,前端无效。
我尝试对其进行多线程处理,使用 Refresh() 方法并到处研究像我这样的问题
这是用文件填充列表视图的方式,每个文件都有一个复选框:
<ListView Grid.Row="0" VerticalAlignment="Top" Height="400" BorderBrush="Black" BorderThickness="2" Grid.ColumnSpan="4" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding Files}" Background="White">
<ListView.View>
<GridView AllowsColumnReorder="False" >
<GridViewColumn DisplayMemberBinding="{Binding File.FullName}" Header="Full Name" Width="200" />
<GridViewColumn DisplayMemberBinding="{Binding File.Name}" Header="Name" Width="200" />
<GridViewColumn DisplayMemberBinding="{Binding File.LastWriteTime, StringFormat='dd-MM-yyyy'}" Header="Last Modified" Width="200"/>
<GridViewColumn DisplayMemberBinding="{Binding File.Length}" Header="Size" Width="150"/>
<GridViewColumn Header="Select" Width="100" >
<GridViewColumn.CellTemplate >
<DataTemplate >
<CheckBox x:Name="cb1" IsChecked="{Binding Path=Selected}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
注意:x:Name="cb1"
是一项检查我是否可以从 MainWindow.xaml.cs 使用它的测试,但它不起作用(可能是因为它有多个文件的问题?)
下面是 selectAll() 方法的后端工作原理:
private void SelectAll()
{ //1st version. this works but checkboxes are not flagged
var dc = DataContext as FileList;
foreach (var _file in dc.Files)
{
_file.Selected = true;
}
//2nd version. this doesn't work at all
for (int i = 0; i < cb1.Items.Count; i++)
{
cb1.SetItemChecked(i, true); //cb1 doesn't exist in the current context
}
}
我有一个叫做 FileWrapper 的 class,它是一个 FileInfo class,我在其中添加了一个 "Selected" bool 属性,它绑定到 "IsChecked" 参数。 FileList 用于创建 FileWrappers 列表。
作为此代码的作者,我清楚地知道每当单击 select 全部按钮时,所有文件都会被 selected。由于我不是该程序的最终用户,我需要一个图形元素来告诉用户哪些文件是 selected,哪些不是。也可能是用户需要列表中 102 个文件中的 100 个,因此他首先 select 全部然后删除 select 其中 2 个会更快。
您可以如下更改模型以更新 UI。
public class FileWrapper : INotifyPropertyChanged
{
private FileInfo _file;
private bool _selected;
public FileWrapper(FileInfo file)
{
File = file;
Selected = false;
}
public FileInfo File
{
get { return _file; }
set
{
_file = value;
OnPropertyChanged("File")
}
}
public bool Selected
{
get { return _selected ; }
set
{
_selected = value;
OnPropertyChanged("Selected")
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
}
}
参考:https://www.c-sharpcorner.com/article/explain-inotifypropertychanged-in-wpf-mvvm/了解INotifyPropertyChange
接口
我正在编写一个程序,允许用户 select 多个文件并使事情发生在他们身上。我使用复选框 select 将所有需要的文件绑定到 ListView。我需要一个按钮来一次 select 所有文件。后端部分有效,前端无效。
我尝试对其进行多线程处理,使用 Refresh() 方法并到处研究像我这样的问题
这是用文件填充列表视图的方式,每个文件都有一个复选框:
<ListView Grid.Row="0" VerticalAlignment="Top" Height="400" BorderBrush="Black" BorderThickness="2" Grid.ColumnSpan="4" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding Files}" Background="White">
<ListView.View>
<GridView AllowsColumnReorder="False" >
<GridViewColumn DisplayMemberBinding="{Binding File.FullName}" Header="Full Name" Width="200" />
<GridViewColumn DisplayMemberBinding="{Binding File.Name}" Header="Name" Width="200" />
<GridViewColumn DisplayMemberBinding="{Binding File.LastWriteTime, StringFormat='dd-MM-yyyy'}" Header="Last Modified" Width="200"/>
<GridViewColumn DisplayMemberBinding="{Binding File.Length}" Header="Size" Width="150"/>
<GridViewColumn Header="Select" Width="100" >
<GridViewColumn.CellTemplate >
<DataTemplate >
<CheckBox x:Name="cb1" IsChecked="{Binding Path=Selected}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
注意:x:Name="cb1"
是一项检查我是否可以从 MainWindow.xaml.cs 使用它的测试,但它不起作用(可能是因为它有多个文件的问题?)
下面是 selectAll() 方法的后端工作原理:
private void SelectAll()
{ //1st version. this works but checkboxes are not flagged
var dc = DataContext as FileList;
foreach (var _file in dc.Files)
{
_file.Selected = true;
}
//2nd version. this doesn't work at all
for (int i = 0; i < cb1.Items.Count; i++)
{
cb1.SetItemChecked(i, true); //cb1 doesn't exist in the current context
}
}
我有一个叫做 FileWrapper 的 class,它是一个 FileInfo class,我在其中添加了一个 "Selected" bool 属性,它绑定到 "IsChecked" 参数。 FileList 用于创建 FileWrappers 列表。
作为此代码的作者,我清楚地知道每当单击 select 全部按钮时,所有文件都会被 selected。由于我不是该程序的最终用户,我需要一个图形元素来告诉用户哪些文件是 selected,哪些不是。也可能是用户需要列表中 102 个文件中的 100 个,因此他首先 select 全部然后删除 select 其中 2 个会更快。
您可以如下更改模型以更新 UI。
public class FileWrapper : INotifyPropertyChanged
{
private FileInfo _file;
private bool _selected;
public FileWrapper(FileInfo file)
{
File = file;
Selected = false;
}
public FileInfo File
{
get { return _file; }
set
{
_file = value;
OnPropertyChanged("File")
}
}
public bool Selected
{
get { return _selected ; }
set
{
_selected = value;
OnPropertyChanged("Selected")
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
}
}
参考:https://www.c-sharpcorner.com/article/explain-inotifypropertychanged-in-wpf-mvvm/了解INotifyPropertyChange
接口