如何解决再次: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 举报,一经查实,本站将立刻删除。