1

名前と進行状況の 2 つの列を持つグリッドを表示したいと考えています。名前は文字列で、進行状況は 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

列の数とそのタイプがわかっている場合は、それらを明示的に作成して に設定することをお勧めしAutoGenerateColumnsますfalse。1 つDataGridTextColumn目は 、2 つ目はカスタム テンプレートを作成します。

<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 に答える