1


次のコードで問題が発生しました。

FolderBrowserDialog ofd = new FolderBrowserDialog();
        ofd.Description = "Wählen Sie bitte den Ordner mit den Videodateien die Sie verschieben und umbenennen wollen...";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
            string path = ofd.SelectedPath;
            foreach (var file in Directory.GetFiles(path)) {
                files.Add(new FileStatus(file, new FileInfo(file).Length));
            }
        }

FileStatusオブジェクトのコードは次のとおりです。

public FileStatus(string filename, long filesize, long currentsize = 0) {
        this.currentsize = currentsize;
        this.filename = filename;
        this.filesize = filesize;
    }
    public string filename { get; set; }
    public long filesize { get; set; }
    public long currentsize { get; set; }
    public double percent {
        get {
            return (currentsize / filesize) * 100;
        }
    }

ListViewのXAMLは次のとおりです。

<ListView Name="lb_data" Grid.Row="2" DataContext="{Binding}" ItemTemplate="{StaticResource fileStatusTemp}">
    </ListView>

fileStatusTempのXAML:

<DataTemplate x:Key="fileStatusTemp">
        <StackPanel>
            <TextBlock Text="{Binding Path=filename}" ></TextBlock>
        </StackPanel>
</DataTemplate>

ItemSource-propertyは、ウィンドウのコンストラクターで設定されます。

lb_data.ItemSource = files;

アドバイスをくれたKDiTragliaに感謝します:)
問題は、このコードを実行するとファイル名が表示されないことです。何も表示されません。別のプロジェクトでは、同様のコードが機能します...
あなたが私を助けてくれることを願っています:)
Greetings Knerd

4

1 に答える 1

2

リストビューにitemssource="{binding??}"がありません。私はまた、このラインがあなたが意図したように機能しているかどうかについても懐疑的です...

DataContext="{Binding}"

編集:

私はこれをすべてテストプロジェクトにコピーしましたが、正常に機能します。これが私のプロジェクト全体です。何か小さなことをしたのかもしれません。

dowhileforはINotifyPropertyChangedについて良い点を示しています。私のコードはロード時に機能しますが、ファイルがコンストラクター以外のイベントから追加された場合は機能しません。これを簡単に修正するには、ListをObservableCollectionに変更するだけです(「System.Collections.ObjectModelを使用して」を含めることを忘れないでください)。以下のコードを更新しました。

public partial class MainWindow : Window
{
    public ObservableCollection<FileStatus> files { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        files = new ObservableCollection<FileStatus>();
        lb_data.ItemsSource = files;

        FolderBrowserDialog ofd = new FolderBrowserDialog();
        ofd.Description = "Wählen Sie bitte den Ordner mit den Videodateien die Sie verschieben und umbenennen wollen...";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            string path = ofd.SelectedPath;
            foreach (var file in Directory.GetFiles(path))
            {
                files.Add(new FileStatus(file, new FileInfo(file).Length));
            }
        }
    }
}

-

<Window x:Class="WPFtest5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate x:Key="fileStatusTemp">
            <StackPanel>
                <TextBlock Text="{Binding Path=filename}" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <ListView Name="lb_data" ItemTemplate="{StaticResource fileStatusTemp}"/>
</Window>

-

public class FileStatus
{
    public FileStatus(string filename, long filesize, long currentsize = 0)
    {
        this.currentsize = currentsize;
        this.filename = filename;
        this.filesize = filesize;
    }
    public string filename { get; set; }
    public long filesize { get; set; }
    public long currentsize { get; set; }
    public double percent
    {
        get
        {
            return (currentsize / filesize) * 100;
        }
    }

}
于 2012-05-09T15:09:17.103 に答える