两种方法创建WPF目录树TreeView和GridView数据绑定
2011-07-28 14:59
549 查看
效果
定义数据结构
public class DirectoryInformation
{
public DirectoryInfo Info { get; set; }
public IEnumerable<FileInfo> Files
{
get
{
return Info.GetFiles();
}
}
public IEnumerable<DirectoryInformation> Directories
{
get
{
try
{
return from di in Info.GetDirectories() select new DirectoryInformation { Info = di };
}
catch (Exception)
{
return null;
}
}
}
}
方法一,在CS代码中自动生成列,并绑定数据
UI界面代码
<Grid Grid.Row="1" x:Name="leftPanel">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="70*"/>
</Grid.ColumnDefinitions>
<TreeView Grid.Column="0" x:Name="leftDirectoryTree">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type fileio:DirectoryInformation}" ItemsSource="{Binding Directories}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Info.Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
<GridSplitter Grid.Column="1" Width="2" HorizontalAlignment="Center" VerticalAlignment="Stretch"/>
<ListView Grid.Column="2" ItemsSource="{Binding ElementName=leftDirectoryTree, Path=SelectedItem.Files}">
<ListView.View>
<GridView x:Name="leftDetailView">
</GridView>
</ListView.View>
</ListView>
</Grid>
CS代码
public MainWindow()
{
InitializeComponent();
LoadFilePanel();
}
private void LoadFilePanel()
{
LoadDirectoryTree();
LoadDetailView();
}
private void LoadDirectoryTree()
{
var drives = new ObservableCollection<DirectoryInformation>();
foreach (var drive in DriveInfo.GetDrives())
{
drives.Add(
new DirectoryInformation
{
Info = new DirectoryInfo(drive.RootDirectory.FullName)
}
);
}
leftDirectoryTree.ItemsSource = drives;
}
private void LoadDetailView()
{
List<string> requiredProperties = new List<string>
{
"Name", "Length", "IsReadOnly", "LastWriteTime"
};
foreach (string name in requiredProperties)
{
GridViewColumn colmun = new GridViewColumn { Header = name };
Binding binding = new Binding(name);
colmun.DisplayMemberBinding = binding;
leftDetailView.Columns.Add(colmun);
}
}
方法二,修改以上代码,在XAML中设置固定列,并绑定数据
<ListView Grid.Column="2" ItemsSource="{Binding ElementName=leftDirectoryTree, Path=SelectedItem.Files}">
<ListView.View>
<GridView x:Name="leftDetailView">
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Length" DisplayMemberBinding="{Binding Length}"/>
<GridViewColumn Header="LastWriteTime" DisplayMemberBinding="{Binding LastWriteTime}"/>
</GridView>
</ListView.View>
</ListView>
CS代码,只需要加载目录树即可
private void LoadFilePanel()
{
LoadDirectoryTree();
}
另外,设置DataTemplate可以自定义每个单元格的显示效果,具体可以再网上搜索一下。
List
<DataTemplate>
<StackPanel
Orientation="Horizontal"
x:Name="richNameContainer">
<Image
Source="{Binding
FullName,
Converter={StaticResource
pathToSmallIcon}}"/>
<Grid>
<TextBlock
x:Name="fileName"
Margin="3,3"
Text="{Binding
Name}"/>
</Grid>
</StackPanel>
</DataTemplate>
Tile
<DataTemplate
x:Key="tileViewTemplate">
<StackPanel
Height="110"
Width="80">
<Image
Source="{Binding
FullName,
Converter={StaticResource
pathToLargeIcon}}"/>
<Grid
HorizontalAlignment="Center">
<TextBlock
x:Name="fileName"
Text="{Binding
Name}"
TextWrapping="Wrap"/>
</Grid>
</StackPanel>
</DataTemplate>
定义数据结构
public class DirectoryInformation
{
public DirectoryInfo Info { get; set; }
public IEnumerable<FileInfo> Files
{
get
{
return Info.GetFiles();
}
}
public IEnumerable<DirectoryInformation> Directories
{
get
{
try
{
return from di in Info.GetDirectories() select new DirectoryInformation { Info = di };
}
catch (Exception)
{
return null;
}
}
}
}
方法一,在CS代码中自动生成列,并绑定数据
UI界面代码
<Grid Grid.Row="1" x:Name="leftPanel">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="70*"/>
</Grid.ColumnDefinitions>
<TreeView Grid.Column="0" x:Name="leftDirectoryTree">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type fileio:DirectoryInformation}" ItemsSource="{Binding Directories}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Info.Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
<GridSplitter Grid.Column="1" Width="2" HorizontalAlignment="Center" VerticalAlignment="Stretch"/>
<ListView Grid.Column="2" ItemsSource="{Binding ElementName=leftDirectoryTree, Path=SelectedItem.Files}">
<ListView.View>
<GridView x:Name="leftDetailView">
</GridView>
</ListView.View>
</ListView>
</Grid>
CS代码
public MainWindow()
{
InitializeComponent();
LoadFilePanel();
}
private void LoadFilePanel()
{
LoadDirectoryTree();
LoadDetailView();
}
private void LoadDirectoryTree()
{
var drives = new ObservableCollection<DirectoryInformation>();
foreach (var drive in DriveInfo.GetDrives())
{
drives.Add(
new DirectoryInformation
{
Info = new DirectoryInfo(drive.RootDirectory.FullName)
}
);
}
leftDirectoryTree.ItemsSource = drives;
}
private void LoadDetailView()
{
List<string> requiredProperties = new List<string>
{
"Name", "Length", "IsReadOnly", "LastWriteTime"
};
foreach (string name in requiredProperties)
{
GridViewColumn colmun = new GridViewColumn { Header = name };
Binding binding = new Binding(name);
colmun.DisplayMemberBinding = binding;
leftDetailView.Columns.Add(colmun);
}
}
方法二,修改以上代码,在XAML中设置固定列,并绑定数据
<ListView Grid.Column="2" ItemsSource="{Binding ElementName=leftDirectoryTree, Path=SelectedItem.Files}">
<ListView.View>
<GridView x:Name="leftDetailView">
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Length" DisplayMemberBinding="{Binding Length}"/>
<GridViewColumn Header="LastWriteTime" DisplayMemberBinding="{Binding LastWriteTime}"/>
</GridView>
</ListView.View>
</ListView>
CS代码,只需要加载目录树即可
private void LoadFilePanel()
{
LoadDirectoryTree();
}
另外,设置DataTemplate可以自定义每个单元格的显示效果,具体可以再网上搜索一下。
List
<DataTemplate>
<StackPanel
Orientation="Horizontal"
x:Name="richNameContainer">
<Image
Source="{Binding
FullName,
Converter={StaticResource
pathToSmallIcon}}"/>
<Grid>
<TextBlock
x:Name="fileName"
Margin="3,3"
Text="{Binding
Name}"/>
</Grid>
</StackPanel>
</DataTemplate>
Tile
<DataTemplate
x:Key="tileViewTemplate">
<StackPanel
Height="110"
Width="80">
<Image
Source="{Binding
FullName,
Converter={StaticResource
pathToLargeIcon}}"/>
<Grid
HorizontalAlignment="Center">
<TextBlock
x:Name="fileName"
Text="{Binding
Name}"
TextWrapping="Wrap"/>
</Grid>
</StackPanel>
</DataTemplate>
相关文章推荐
- 【原创】SQL数据库数据绑定到TreeView菜单目录的类方法实现
- 学习WPF: 创建数据绑定目录树
- TreeView递归绑定数据的两种方法
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- TreeView数据绑定方法
- ListView 数据绑定的两种方法
- asp.net Xml绑定到数据控件的两种简单方法
- WPF ListView 分组数据绑定 TreeView递归数据绑定
- 读取Xml文件,创建DataTable,递归循环Xml节点,添加数据到DataTable,绑定到GridView
- WPF中RadioButton绑定数据的正确方法
- ASP.NET GridView绑定数据方法和转换绑定数据
- web开发——4.一个完整的web项目和子应用程序的创建以及数据模型操作的两种方法
- 基于WPF数据绑定的鼠标随动显示光标位置的方法
- 递归/非递归 两种方法自动创建多级目录
- ASP.NET-GridView数据绑定的几种方法
- WPF新手之如何将数据绑定到TreeView
- WPF 数据绑定方法分类
- WPF的TreeView数据绑定基础
- ASP.NET 当GridView中没有数据的时候,显示标题栏 并且给出一行数据提示 (两种方法)
- 读取Xml文件,创建DataTable,递归循环读取Xml数据添加到DataTable,绑定数据到GridView