如何显示复选框实际上已被选中

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接口