我正在学习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部分包含DataContext
和CollectionViewSource
:
<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 Path
和FilesInfo
?
有没有办法通过XAML和ViewModel类来实现这一点,而不使用Xaml文件后面的代码?
答案 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>