如何存储和显示多个用户选择的文件

时间:2012-01-04 14:07:43

标签: c# wpf dictionary wpf-controls

好吧,这很难说清楚,但我在这里:

在我当前的项目中,我试图允许用户选择可执行文件(这些文件将在我的应用程序启动时启动)。另外,我想让用户选择是否希望我的应用程序在它自己关闭时关闭这些启动的可执行文件(一个简单的布尔选项,每个.exe一个)。

我使用一个打开文件对话框允许用户选择一个可执行文件,我需要的只是路径(我成功获得),但是我需要以允许用户选择的方式显示这些文件并删除它们,并为每一个设置上述布尔值(如他们所愿)。

我可以轻松获取文件名和图标(非常适合用户显示),但我不知道哪个控件允许我显示此包含布尔复选框。无论是什么控制,它都需要允许用户双击这些条目(在这种情况下删除它们)。

现在我假设我可以使用字典来处理幕后数据,字符串是对话框返回的文件的路径,而bool是bool我需要允许用户更改控制...但我不确定这是否是处理这些数据的最佳方式,我不确定如何使用我可以从路径收集的信息填充控件(并允许控件更改布尔值)选项)。

如果这没有意义,我很抱歉,我发现将困境置于文字中非常非常困难!

如果有人可以提供任何帮助,请提前致谢!

4 个答案:

答案 0 :(得分:2)

在WPF中执行此操作的最简单方法是使用数据绑定。您可以简单地将ObservableCollection绑定到DataGrid,其余的只能工作。

首先,您应该创建自己的类,用boolean字段包装文件名,以指示它是否被选中。

class FileSelection
{
    public bool IsSelected { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }
    public string Picture { get; set; }
}

将DataGrid添加到表单中,如下所示:

 <DataGrid AutoGenerateColumns="False" Name="dataGrid1"
     BeginningEdit="dataGrid1_BeginningEdit">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding IsSelected}"/>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Width="25" Height="25" Source="{Binding Path=Picture}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Binding="{Binding FileName}"/>
        </DataGrid.Columns>
    </DataGrid>

然后在表单中添加代码以进行绑定:

public partial class MainWindow : Window
{
    ObservableCollection<FileSelection> files;

    public MainWindow()
    {
        InitializeComponent();

        this.files = new ObservableCollection<FileSelection>();
        this.dataGrid1.ItemsSource = this.files;
    }

当您打开文件对话框时,只需将返回的路径添加到集合中,如下所示:

 var ofd = new OpenFileDialog();
 var result = ofd.ShowDialog();
 if (result == true)
 {
     var fs = new FileSelection { 
                FilePath = ofd.FileName, 
                FileName = System.IO.Path.GetFileNameWithoutExtension(ofd.FileName),
                Picture = @"[PATH TO IMAGE]",
                IsSelected = true };
     this.files.Add(fs);
 }

我通过打开一个messageBox窗口来测试它,以显示当前选择的文件,如下所示:

var message = string.Join(Environment.NewLine, this.files.Where(f => f.IsSelected).Select(f => f.FilePath).ToArray());
MessageBox.Show(message);

希望这样做!

<强>更新

我添加了另一列,使用DataGridTemplateColumn显示图像,并将显示的文本更改为仅显示文件名,同时保留数据绑定列表中的完整路径。

我还向DataGrid添加了一个事件处理程序,以便您可以双击一行来操作所选文件。您需要将以下方法添加到代码隐藏类中才能使用它。

private void dataGrid1_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
   var file = e.Row.DataContext as FileSelection;

   // Delete the file here...

   e.Cancel = true;
}

请注意,绑定到单击行的FileSelection存储在Row的DataContext属性中。您需要将eventArgs参数的Cancel属性设置为true,以使该行不进入编辑模式。

答案 1 :(得分:0)

正如我可以从您的问题中得到的那样,您正试图这样做..

  

你想要一个控件,它将显示目录中文件的图标(OpenFileDialog框做什么),但你想为每个显示的图标增加一些布尔字段的功能,如复选框。

那么框架中没有内置控件用于您的目的。您可以考虑自己创建一个,为此可以使用FileDirectory相关类。

答案 2 :(得分:0)

如果您正在使用ASP.NET,请尝试CheckBoxList 或者LisBox如果您正在使用Windows表单

答案 3 :(得分:0)

没有内置的WPF控件可以满足您的特定需求(除了DataGrid,在通过双击移除项目时很难处理),但您可以轻松地构建自己的这样:< / p>

<Grid MouseLeftButtonDown="HandleClick">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <CheckBox IsChecked="{Binding YourCheckedProperty}" />
    <Grid Grid.Column="1">
        <!-- Here you can display your icon and filename -->
    </Grid>
</Grid>

要存储数据,您应该使用包装类:

public class FileWrapper
{
    public bool KillAtShutdown{get;set;}
    public string Path{get;set;}
    // your other properties
}

并将包装器存储在List中(如果使用事件和代码后面的东西)或ObservableCollection(如果使用绑定)