ListView ItemTemplate和ItemsSource不显示预期值

时间:2012-05-09 15:04:25

标签: wpf listview itemtemplate


我遇到了以下代码的问题:

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,建议:) 所以问题在于,当我运行此代码时,它不会显示文件名。它什么都没显示。 在另一个项目中,一段类似的代码可以正常工作...... 我希望你能帮助我:) 问候Knerd

1 个答案:

答案 0 :(得分:2)

您在列表视图中缺少itemssource =“{binding ??}”。我也怀疑这条线是否按照您的意图工作......

DataContext="{Binding}"

编辑:

我把这一切都复制到一个测试项目中,它运行正常,这是我整个项目的逐字记录,也许我做了一些小事。

dowhilefor对INotifyPropertyChanged提出了一个很好的观点,我的代码在加载时工作,但如果文件是从构造函数以外的事件添加的话,则无法工作。要轻松解决这个问题,只需将List更改为ObservableCollection(不要忘记包含'using 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;
        }
    }

}