如何用多个选定的文件名填充WPF DataGrid以进行编辑?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用多个选定的文件名填充WPF DataGrid以进行编辑?相关的知识,希望对你有一定的参考价值。

我正在尝试在WPF中创建一个非常简单的批处理文件重命名器应用程序。 WinForms中的实现很容易,但是在这里,我感觉我尝试了很多不同的实现。我是WPF的新手,也是C#的新手。

简而言之,我想将文件读入列表或类中,但是建议实施。将其绑定到Datagrid,将可编辑的文件名读回到列表或列表类中。

我已经在此上浪费了很多时间,在这一点上,我真的会请人帮忙。

[很抱歉,如果有人提出这个问题,我在这里看到的所有内容看起来都很酷,但在我的情况下仍然没有用。

非常感谢

XAML

<Window x:Class="RenamerApp_3._0.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:FileInfo;assembly=FileCollection"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid>
        <StackPanel>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="8*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <Button Grid.Column="0" x:Name="BtnBrowse" Content="Browse" Click="BtnBrowse_Click" />
                <TextBox Grid.Column="1" x:Name="TxtbxActiveDir" />
                <Button Grid.Column="2" x:Name="BtnApply" Content="Apply" />
            </Grid>
            <DataGrid x:Name="DataGridFileNames" ItemsSource="Binding FileCollection">
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="OriginalFileNamesColumn" Header="Original" Width="*" 
                                        IsReadOnly="True" />
                    <DataGridTextColumn x:Name="NewFileNamescolumn" Header="New" Width="*"
                                        IsReadOnly="False" />
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>
    </Grid>
</Window>

背后的代码

namespace RenamerApp_3._0

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    
        OpenFileDialog dialog = new OpenFileDialog();

        public MainWindow()
        
            InitializeComponent();
            InitializeOpenFileDialog();
        

        private void BtnBrowse_Click(object sender, RoutedEventArgs e)
        
            Nullable<bool> result = dialog.ShowDialog();
            if (result.HasValue && result.Value)
            
                List<string> fileNames = dialog.FileNames.ToList();
                FileName.FileCollection collection = new FileName.FileCollection(fileNames);
                DataGridFileNames.DataContext = collection;
            
        

        private void InitializeOpenFileDialog()
        
            this.dialog.Multiselect = true;
        
    

FileInfo类

namespace FileInfo

    public class FileName
    
        public string originalFileName  get; set; 
        public string newFileName  get; set; 

        public FileName()
        
        

        public class FileCollection : List<FileName>, INotifyPropertyChanged
        
            public event PropertyChangedEventHandler PropertyChanged;

            public FileCollection(List<string> fileNames)
            
                foreach (var item in fileNames)
                
                    this.Add(new FileName()  originalFileName = item, newFileName = item );
                
            
        
    

答案

XAML

<DataGrid x:Name="DataGridFileNames" ItemsSource="Binding" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="OriginalFileNamesColumn" Header="Original" Width="*"  Binding="Binding originalFileName" IsReadOnly="True" />
        <DataGridTextColumn x:Name="NewFileNamescolumn" Header="New" Width="*" Binding="Binding newFileName" IsReadOnly="False" />
    </DataGrid.Columns>
</DataGrid>

当集合被赋给DataContext时,ItemsSource仅使用Binding。没有绑定路径。 DataGridTextColumn需要向数据对象成员添加Binding。

FileName类

public class FileName

    public string originalFileName  get; set; 
    public string newFileName  get; set; 

不需要列出<>,INotifyPropertyChanged。 ObservableCollection是进行双向绑定的简便方法。

MainWindow

public partial class MainWindow : Window

    OpenFileDialog dialog = new OpenFileDialog();

    public ObservableCollection<FileName> fileNames = new ObservableCollection<FileName>();

    public MainWindow()
    
        InitializeComponent();
        InitializeOpenFileDialog();
    

    private void BtnBrowse_Click(object sender, RoutedEventArgs e)
    
        Nullable<bool> result = dialog.ShowDialog();
        if (result.HasValue && result.Value)
        
            foreach(string filename in dialog.FileNames)
            
                FileName fileName = new FileName()  originalFileName = filename ;
                fileNames.Add(fileName);
            

            DataGridFileNames.DataContext = fileNames;
        
    

    private void InitializeOpenFileDialog()
    
        this.dialog.Multiselect = true;
    

以上是关于如何用多个选定的文件名填充WPF DataGrid以进行编辑?的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid 选定的行样式

WPF Datagrid 样式选定的行

WPF的DataGrid中如何获取当前被选定的行的第一个单元格的值?

Excel如何用文本填充所有选定的空白单元格

读取自定义Datagrid的每个单元格数据 - WPF C#

wpf:DataGrid 禁用选定的行样式 - 或行选择