1

我想显示一个包含两列的网格 - 名称和进度。名称应该是一个字符串,进度是一个介于 0.00 和 1.00 之间的百分比值。我希望百分比显示为进度条或类似的东西。

我的窗口中有一个 DataGrid,创建了一个带有双精度和文件名的简单类。我的主要代码是这样的:

public ObservableCollection<DownloadFile> files = new ObservableCollection<DownloadFile>();

然后我将 设置ItemsSource为这个集合,自动生成列设置为 true。到目前为止它工作正常,包括更新。

现在类中的 double Value 是 0 到 1 之间的值,一个百分比。由于没有进度条,我决定可以更改相应行的背景颜色,如下所示:

row.cell.Style.Background = new LinearGradientBrush(
    Brushes.Green.Color,
    Brushes.White.Color,
    new Point(percentage, 0.5),
    new Point(percentage + 0.1, 0.5));

有没有办法以某种方式..控制网格显示的内容?现在,我要么对差异感到不知所措,要么 DataGrid 与旧的 DataGridView 相比是一个巨大的退步,这也不是很好。但这似乎完全绑定到一些我不能轻易手动更改的真实数据。

4

1 回答 1

2

如果您知道列数及其类型,最好显式创建它们并设置AutoGenerateColumnsfalse. 第一个将是 a DataGridTextColumn,第二个我们将创建一个自定义模板:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding FilesDownloading}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="File" Binding="{Binding Name}"/>
        <DataGridTemplateColumn Header="Progress">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ProgressBar Minimum="0" Maximum="1" Value="{Binding Progress}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

似乎您将在文件下载时更新进度,因此您需要您的DownloadFile类来实现INotifyPropertyChanged接口。此外,这使得在下载完成时发送消息变得容易:

public class DownloadFileInfo : INotifyPropertyChanged
{
    public string Name { get; set; }

    private double _progress;
    public double Progress
    {
        get { return _progress; }
        set
        {
            _progress = value;
            RaisePropertyChanged("Progress");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
于 2012-11-08T21:03:05.637 回答