ListView绑定到包含Dictionary的Custom类的列表

时间:2012-11-30 15:02:31

标签: c# wpf xaml listview dictionary

我正在学习WPF,我正在尝试使用文件夹列表(作为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; }
    }
}

和ViewModel:

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 Name(Dictionnary&lt; string,string&gt;)信息的File PathFilesInfo

有没有办法通过XAML和ViewModel类来实现这一点,而不使用Xaml文件后面的代码?

1 个答案:

答案 0 :(得分: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>