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 属性在窗口的构造函数中设置:

lb_data.ItemSource = files;

感谢 KDiTraglia 的建议 :)
所以问题是当我运行这段代码时它不显示文件名。它什么也没显示。在另一个项目中,一段类似的代码可以工作......
我希望你能帮助我:)
问候 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 回答