2012-11-30 96 views
0

我正在學習WPF,我試圖用列表文件夾(作爲ListView組)和每個文件夾(作爲ListView項目)的文件來填充ListView。ListView綁定到包含詞典的自定義類的列表

使用WPF/MVVM Quick Start Tutorial,我創建以下類(業務移除)

public class PatchGen 
{ 
    public PatchGen() { } 

    private string _folderName; 
    private Dictionary<string, string> _filesInfo = new Dictionary<string, string>(); 

    public string FolderName 
    { 
     get { return _folderName; } 
     set { _folderName= value; } 
    } 
    public Dictionary<string, string> FilesInfo 
    { 
     get { return _filesInfo; } 
     set { _filesInfo = value; } 
    } 
} 

和視圖模型:

public class PatchGenViewModel : ObservableObject 
{ 
    public PatchGenViewModel() 
    { 
    } 

    List<PatchGen> _folderList = new List<PatchGen>(); 

    public List<PatchGen> Folders 
    { 
     get 
     { 
      return _folderList; 
     } 
     set { } 
    } 

    void AddFilesExecute() 
    { 
     //business here 
    } 

    bool CanAddFilesExecute() 
    { 
     return true; 
    } 

    public ICommand AddFiles { get { return new RelayCommand(AddFilesExecute, CanAddFilesExecute); } } 

的XAML部分包括DataContextCollectionViewSource

<Window.DataContext> 
    <local:PatchGenViewModel></local:PatchGenViewModel> 
</Window.DataContext> 
<Window.Resources> 
    <CollectionViewSource x:Key='groups' 
         Source="{Binding Path=Folders}"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="FolderName" /> 
    </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

和ListView:

<ListView Grid.Row="1" 
      HorizontalAlignment="Stretch" 
      Name="lstViewServices" 
      ItemsSource='{Binding Source={StaticResource groups}}'> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="File Name" 
         DisplayMemberBinding="{Binding Path=??? }" 
         Width="100" /> 
     <GridViewColumn Header="File Path" 
         DisplayMemberBinding="{Binding Path=??? }" 
         Width="Auto" /> 
    </GridView> 
    </ListView.View> 
</ListView> 

ListView組未顯示文件夾名稱。 ?

如何使File NameFile Path代表FilesInfo(字典中的字符串> string>)信息顯示?

有沒有辦法通過XAML和ViewModel Class來完成,而沒有Xaml文件背後的代碼?

+0

也許這是因爲CollectionViewSource檢索其值時Folder列表爲空。如果你的集合正在改變,你應該考慮實現INotifyPropertyChanged(如果你每次重新分配它)或使用ObservableCollection –

+0

你可以發佈你想要的樣子的截圖嗎? – Rhyous

回答

0

您只需要將文件名與文件綁定到文件夾名稱屬性即可。

對於文件路徑,您需要將其綁定到FilesInfo屬性。爲什麼是字典?我想我不明白你爲什麼在這裏使用字典?也許我錯過了一些東西,但你應該放棄字典並創建自己的小對象。

public class FileInfo 
{ 
    public string FileName {get;set;} 
    public string FilePath {get;set;} 
} 

然後當然改變你的PatchGen對象來使用它來代替字典。

也許你想要它看起來像一個截圖會有所幫助。但是,如果您查看您的XAML,則無法放置您的FolderName。你只有FileName和FilePath的地方。

<ListView Grid.Row="1" 
      HorizontalAlignment="Stretch" 
      Name="lstViewServices" 
      ItemsSource='{Binding Source={StaticResource groups}}'> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="File Name" 
         DisplayMemberBinding="{Binding Path=FileName }" 
         Width="100" /> 
     <GridViewColumn Header="File Path" 
         DisplayMemberBinding="{Binding Path=FilePath}" 
         Width="Auto" /> 
    </GridView> 
    </ListView.View> 
</ListView> 

所以你應該爲FolderName添加一個位置。您看起來有兩個列表:文件夾列表和每個文件夾的文件列表。但是你的觀點只有一個層次。

這是一個有兩個級別的例子。

<ItemsControl ItemsSource='{Binding Folders}'> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
     <Label Content="{Binding FolderName}" /> 
     <ListView Grid.Row="1" 
        HorizontalAlignment="Stretch" 
        Name="lstViewServices" 
        ItemsSource="FileInfo"> 
      <ListView.View> 
      <GridView> 
       <GridViewColumn Header="File Name" 
           DisplayMemberBinding="{Binding Path=FolderName}" 
           Width="100" /> 
       <GridViewColumn Header="File Path" 
           DisplayMemberBinding="{Binding Path=FolderName }" 
           Width="Auto" /> 
      </GridView> 
      </ListView.View> 
     </ListView> 
     </StackPanel> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

謝謝@Rhyous,我只是想知道是否有辦法綁定這種對象。看起來不是。 – Boomer