微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

再次:datagridview 不更新 observablecollection 更改

如何解决再次:datagridview 不更新 observablecollection 更改

我知道这个问题已经被问过一次又一次。我已经多次使用该模式,它有效,但这次(我很惭愧)我遇到了一个无法解决的问题。

我有一个包含一列的数据网格,我想在其中显示文件夹中的文件名(我正在对文件做一些工作,但这无关紧要)。数据网格“拒绝”在运行时更新 - 它在程序结束后显示正确的列表! 这是 XML(我删除了一些控件):

<Window x:Class="BGLstats.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:BGLstats"
        mc:Ignorable="d"
        Title="MainWindow" Height="1000" Width="1100" xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit">
    <Window.Resources>
        <Style x:Key="DataGridColumnHeaderStyle" targettype="{x:Type DataGridColumnHeader}">
            <Setter Property="FontWeight" Value="Bold" />
        </Style>
    </Window.Resources>
        <Grid >
        <Grid.ColumnDeFinitions>
            <ColumnDeFinition Width="700" />
            <ColumnDeFinition Width="350" />
        </Grid.ColumnDeFinitions>
        <Grid.RowDeFinitions>
            <RowDeFinition Height="100" />
            <RowDeFinition Height="*" />
            <RowDeFinition Height="*" />
            <RowDeFinition Height="*" />
        </Grid.RowDeFinitions>
        <DataGrid Grid.Column="1" Grid.RowSpan="4" Margin="10,10,0" MaxHeight="900" Width="330" x:Name="dataGridFiles" AutoGenerateColumns="False" HorizontalAlignment="Left" VerticalAlignment="Stretch" ItemsSource="{Binding}" 
                                CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" GridLinesVisibility="All" IsReadOnly="True"
                                HorizontalGridLinesBrush="#FFA0A0A0" VerticalGridLinesBrush="#FFA0A0A0" CanUserResizeRows="False" BorderThickness="0" 
                                FontSize="14" ColumnHeaderHeight="29" HeadersVisibility="Column" x:FieldModifier="public" VerticalScrollBarVisibility="Auto" ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding FileName}" Width="330" Header="File names" FontSize="12"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

这是代码。没有其他线程,一切都非常简单(在 TextBox 中指定文件夹路径后按下按钮时调用 ProcessInpFileName):

public partial class MainWindow : Window
    {
        public static ObservableCollection<FileNameItem> Files;
        public MainWindow()
        {
            InitializeComponent();
            Files = new ObservableCollection<FileNameItem>();
            dataGridFiles.ItemsSource = Files;
        }

        public void ProcessInpFileName(object sender,RoutedEventArgs e)
        {
            // some code here has been removed for clarity:
            string[] fileEntries = Directory.GetFiles(TargetPath.Text);
            foreach (string strPath in fileEntries)
            {
                string fileName = Path.GetFileNameWithoutExtension(strPath);
                Files.Add(new FileNameItem(fileName));
            }
        }
    }
    public class FileNameItem : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string callerName = "")
        {
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(callerName));
        }
        private string _fileName;
        public string FileName 
        {
            get { return _fileName; }
            set
            {
                if (_fileName != value)
                {
                    _fileName = value;
                    OnPropertyChanged("FileName");
                }
            }
        }
        public FileNameItem(string fn)
        {
            FileName = fn;
        }
    }
}

好吧,我有很多文件,每个文件都被处理了大约 2-3 秒,名称应该在 datagridview 中一一添加,但它们不会在程序结束之前显示

它必须非常非常简单,但它打败了我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。