WPF中的绑定需要数据源提供的是一个属性。 为什么DataGrid可以呢?是因为DataTable到DataTable上的其实是DataView,然后又被封装成了ICollectionView, 这样之后,就能够提供出一个属性给其里面的单元格绑定使用了。
我测试了你的问题,不过是否进行封装,DataTable都会被隐式转成DataView:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel.Resources>
<CollectionViewSource x:Key="source" Source="{Binding}"/>
</StackPanel.Resources>
<TextBlock Text="{Binding Source={StaticResource source}, Path=Name}"/>
<TextBlock Text="{Binding Source={StaticResource source}, Path=Age}"/>
<TextBlock Text="{Binding Path=Name}"/>
<TextBlock Text="{Binding Path=Age}"/>
</StackPanel>
</Window>
C#:
public MainWindow()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Name"));
dt.Columns.Add(new DataColumn("Age"));
DataRow dr = null;
for (int i = 0; i < 10; i++)
{
dr = dt.NewRow();
dr["Name"] = "Name " + i;
dr["Age"] = 20+ i;
dt.Rows.Add(dr);
}
this.DataContext = dt;
}
但是,你将一个集合的所有成员的又一个属性绑定给一个元素,不是很有意义。不过你需要绑定集合中某一个元素的属性的话,用[index]在Path定位。
例如:
<TextBlock Text="{Binding Source={StaticResource source}, Path=Rows[2][0]}"/>
<TextBlock Text="{Binding Source={StaticResource source}, Path=Rows[2][1]}"/>
<TextBlock Text="{Binding Path=Rows[2][0]}"/>
<TextBlock Text="{Binding Path=Rows[2][1]}"/>
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
