2012-05-09 21 views
1


我用下面的代碼一個問題:的ListView的ItemTemplate和ItemsSource時沒有表現出預期值

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; 
     } 
    } 

的XAML中ListView是:

<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

+0

如果你在這一行lb_data.ItemSource =文件斷點; 文件是否包含有文件名的有效項目? –

+0

是的,也lb_data.Items包含在列表中的相同的對象... – Knerd

回答

2

你缺少一個的ItemsSource =「{結合??}」在您的列表視圖。我也持懷疑態度,以該行是否正在工作,你打算......

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; 
     } 
    } 

} 
+0

這是我最後一次所採取的方式。我忘了說itemsource是在Window的構造函數中設置的。 – Knerd

+0

@Knerd我不知道爲什麼這不應該工作。我在這段代碼中唯一想念的是實現的INotifyPropertyChanged。但是這至少應該工作一次。是的,刪除DataContext =「{綁定}」這絕對沒有。 datacontext已經被繼承,在這種情況下不需要顯式設置。 – dowhilefor

+0

更新代碼佔INotifyPropertyChanged的,我懷疑這是一個實際的問題,但目前還不清楚數據類型的OP的「文件」是從代碼發佈 –