【发布时间】:2019-07-24 09:29:29
【问题描述】:
我正在编写一个程序,该程序允许用户选择多个文件并使用它们进行操作。我使用复选框来选择绑定到 ListView 的所有需要的文件。我需要一个按钮来一次选择所有文件。后端部分有效,前端无效。
我尝试了多线程,使用 Refresh() 方法并到处研究像我这样的问题
这是 Listview 填充文件的方式,每个文件都有一个复选框:
<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 的类,它是一个 FileInfo 类,我在其中添加了一个“Selected”布尔属性,该属性绑定到“IsChecked”参数。 FileList 用于创建 FileWrapper 列表。
作为此代码的作者,我确切地知道,无论何时单击全选按钮,都会选择所有文件。由于我不是程序的最终用户,我需要一个图形元素来告诉用户哪些文件被选中,哪些文件未被选中。也可能是用户需要列表中 102 个文件中的 100 个,因此他先全选然后取消选择其中 2 个会更快。
【问题讨论】:
-
'Selected' 属性是否有 OnPropertyChange() ?
-
在行视图模型中实现 inotifypropertychanged,检查 selected 是公共属性并在 jt 设置时引发 propertychanged。您可能还必须在 ischecked 绑定上设置 mode=twoway。
-
FileWrapper 类如下所示: ` public FileWrapper(FileInfo file) { File = file;选择=假; } 公共文件信息文件 { 获取;放; } 公共布尔选择 { 获取;放; } ` @Aakanksha 能否请您提供一个链接,详细解释 OnPropertyChange() ?谢谢
-
对不起,我不知道如何正确显示代码:(
-
在你的模型中你需要继承
INotifyPropertyChanged接口并实现OnPropertyChanged方法。然后在你的属性设置器中调用方法
标签: c# wpf listview checkboxlist