0

我正在学习 WPF,我试图用文件夹列表(作为 ListView 组)和每个文件夹的文件(作为 ListView 项目)填充 ListView。

使用WPF/MVVM 快速入门教程,我创建了以下类(业务已删除)

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 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 组未显示文件夹名称。?

如何显示代表(Dictionnary < string,string > ) 信息的File Nameand ?File PathFilesInfo

有没有办法通过 XAML 和 ViewModel 类来做到这一点,而不需要 Xaml 文件的代码?

4

1 回答 1

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>
于 2012-11-30T18:14:02.773 回答